2015-05-02 112 views
0

好的,所以我在玩Java中的鏈表。我試圖理解爲什麼我的deleteNode方法不會刪除頭節點。它適用於其他節點。爲什麼我的鏈表的頭節點沒有被刪除?

這裏的方法

Node deleteNode(Node head, int d){ 
     Node n = head; 
     if(n.data == d){ 
      return head.next; 
     } 

     while(n.next != null){ 
      if(n.next.data == d){ 
       n.next = n.next.next; 
       return head; 
      } 
      n = n.next; 
     } 
     return head; 
    } 

樣品輸入:

Node ll = new Node(1); 
ll.appendToTail(2); 
ll.appendToTail(3); 

當我打電話給我的方法

ll.deleteNode(ll, 2); 

,然後打印當前的節點,我得到的1正確的輸出 - > 3,但是當我用這個方法刪除初始節點或者頭部時

ll.deleteNode(ll, 1); 

我得到的輸出1-> 2-> 3,但我期望2-> 3,其中2成爲新的頭。下面是整個實施只是櫃面

public class Node { 

    Node next = null; 
    int data; 

    public Node(int d){ 
     data = d; 
    } 

    void appendToTail(int d){ 

     Node end = new Node(d); //Item to append to the end 
     Node n = this; //To access Class object next 

     while(n.next != null){ 
      n = n.next; 
     } 
     n.next = end; 
    } 

    Node deleteNode(Node head, int d){ 
     Node n = head; 
     if(n.data == d){ 
      return head.next; 
     } 

     while(n.next != null){ 
      if(n.next.data == d){ 
       n.next = n.next.next; 
       return head; 
      } 
      n = n.next; 
     } 
     return head; 
    } 

    void printNodes(){ 
     Node n = this; 
     while(n.next != null){ 
      System.out.println(n.data); 
      n = n.next;  
     } 
     System.out.println(n.data); //print out the last node 
    } 

    //For fun, to simulate how python print's a list 
    // printed example [1, 2, 3] 
    void listNodes(){ 
     Node n = this; 
     StringBuilder sb = new StringBuilder(); 
     sb.append("["); 
     while(n.next != null){ 
      sb.append(n.data).append(", "); 
      n = n.next; 
     } 
     sb.append(n.data); 
     sb.append("]"); 
     System.out.println(sb.toString()); 
    } 
} 

回答

2

根據你寫的函數,你應該使用它,如ll = ll.deleteNode(ll, 1)

此外,您不需要參考head參數,因爲this已經是head

如果你願意,你也可以改變返回類型void,更換return head.nextdata = head.next.data; next = head.next.next,並與return;取代return head;;那麼你將能夠像你試圖這樣稱呼它。

下面是完整的方法:

void deleteNode(int d){ 
    Node n = this; 
    if(n.data == d){ 
     data = next.data; 
     next = next.next; 
     return; 
    } 

    while(n.next != null){ 
     if(n.next.data == d){ 
      n.next = n.next.next; 
      return; 
     } 
     n = n.next; 
    } 
    return; 
} 
+0

謝謝,這正是我一直在尋找的。 – reticentroot

2

當你打電話deleteNode()刪除列表的頭部,該方法不會做任何事情。

這段代碼執行:

Node n = head; 
    if(n.data == d){ 
     return head.next; 
    } 

它返回頭節點的.next領域,但不修改任何東西 - 所以它不能刪除任何內容。當您撥打deleteNode()以外的其他任何東西時,您將到達while循環並實際修改列表。

+0

Oh..I認爲,這將在目前的頭分配到列表中的下一個對象。 – reticentroot