2016-05-14 72 views
-1

這是我在刪除具有給定節點值的節點之前刪除節點的方法,但它不起作用,我該怎麼辦。例如,1到5,把RemoveBefore(3),它會刪除4.鏈接列表方法,在具有給定節點值的節點之前移除節點

public void RemoveBefore(int nodeValue) 
{ 
    Node curr = start; 

    while (curr != null) 
    { 
     Node next = curr.next; 

     if (next!= null && next.nodeValue == nodeValue) 
     {     
      curr= next.next;     
      return; 
     } 
     curr = curr.next; 

    } 
} 
+1

如果你寫了這段代碼,你就足夠回答你的問題了自。 – Dici

回答

0

修改的curr值像你這樣:

curr= next.next; 

將不會更改列表本身,因爲curr只是一個本地引用,改變引用不會改變它指向的內容。

如果您希望更改生效,您需要修改引用指向的對象的內容。

在你的情況的情況如下:

... -> prev -> curr -> next -> next.next -> ... 

如果next有你的價值,你想prev直接指向next,其實從列表中像這樣除去curr

... -> prev -> next -> next.next -> ... 

這意味着您要更改prev,因此它指向next而不是curr

因此,在你的代碼,你需要引入prev變量並管理的特殊情況時,刪除的節點是啓動本身:

startNode -> node2 -> node3 -> ... 

有可能成爲:

node2 (the new start node) -> node3 -> ... 

這是我如何修改代碼:

public void RemoveBefore(int nodeValue) 
{ 
    Node curr = start; 
    Node previous = null; 

    while (curr != null) 
    { 
     Node next = curr.next; 

     if (next!= null && next.nodeValue == nodeValue) 
     {     
      if(previous == null) { 
       start = next;   // change directly the start of the list 
      } else { 
       previous.next = next; // point to next instead of curr 
      } 
      return; 
     } 
     previous = curr; 
     curr = curr.next; 
    } 
} 
+0

但是當我改變了,沒有發生,當我跑步。 – Kevin

+0

是的,我糾正了我的答案 –