2016-11-06 77 views
0

我試圖從我單鏈表中刪除最後一個節點。但是我仍然無法解決代碼中的這個錯誤。我的deleteFromEnd方法不會刪除最後一個節點。在調用delete方法後,它仍然顯示我想要刪除的節點。列表的其餘部分將被刪除,但最後一個節點本身不會被刪除。你能告訴我我錯過了什麼,或者錯誤在哪裏?無法刪除鏈表中的最後一個節點

的LinkedList:

package lab5; 

public class LinkedList { 

    public static void main(String argsp[]) { 
     List ob = new List(); 

     ob.addAtStart("y", 6); 
     ob.addAtStart("w", 4); 
     ob.addAtStart("z", 3); 

     ob.addAtEnd("a", 3); 
     ob.addAtEnd("b", 4); 
     ob.addAtEnd("c", 5); 

     /* 
     * ob.display(); System.out.println("Deleted first one"); 
     * ob.deleteFromStart(); 
     */ 
     ob.display(); 
     System.out.println("Deleted End one"); 
     ob.deleteFromEnd(); 
     ob.display(); 
    } 
} 

列表:

package lab5; 

public class List { 

    Node head; 

    public List() { 
     head = null; 
    } 

    public List(Node e) { 
     head = e; 
    } 

    Node oldfirst = null; 
    Node lasthead = null; 

    public void addAtStart(String name, int age) { 
     Node newObject = new Node(name, age); 
     newObject.next = head; 

     if (oldfirst == null) { 
      oldfirst = newObject; 
     } 
     head = newObject; 
     lasthead = head; 

    } 

    public void display() { 
     Node store = head; 
     while (store != null) { 
      store.display(); 
      store = store.next; 
      System.out.println(); 
     } 
    } 

    public void addAtEnd(String name, int age) { 
     Node atEndValue = new Node(name, age); 
     oldfirst.next = atEndValue; 
     oldfirst = atEndValue; 
    } 

    public void deleteFromStart() { 
     if (head.next != null) { 
      head = head.next; 
     } 
    } 

    public void deleteFromEnd() { 
     Node start = head; 
     Node prev = null; 
     while (head != null) { 
      prev = head; 
      head = head.next; 
     } 
     prev.next = null; 
     head = prev; 
    } 

    public Node search(String name) { 
     return head; 
    } 

    public boolean isEmpty() { 
     return head == null; 
    } 

    public int size() { 
     return (head.toString()).length(); 
    } 
} 

節點:

package lab5; 

public class Node { 

    String name; 
    int age; 
    Node next; 

    public Node() { 
     name = "Abc"; 
     age = 10; 
     next = null; 
    } 

    public Node(String name, int age) { 
     this.name = name; 
     this.age = age; 
     next = null; 
    } 

    public void display() { 
     System.out.println("Name: " + name + " Age: " + age); 
    } 
} 
+0

@nbrooks現在我問新的問題。 – Shahzad

+0

'head = head.next;'有什麼意義? – shmosel

+0

你正在遍歷使用'head'而不是使用本地變量'start'。 – shmosel

回答

1

要修改名單這是不對的頭指針。以下方法爲我工作。

public void deleteFromEnd() { 
     Node start = head; 
     Node prev = null; 

     if(start == null || start.next == null) 
     { 
      head = null; 
      return; 
     } 
     while (start.next != null) { 
      prev = start; 
      start = start.next; 
     } 
     prev.next = null; 
    } 

在分析了您的代碼後,我發現了其他一些問題。您需要更新addAtStartaddAtEnd方法。

Node lasthead = null; 

public void addAtStart(String name, int age) { 
    Node newObject = new Node(name, age); 
    newObject.next = head; 
    if(head == null) 
     lasthead = newObject; 
    else if(head.next == null) 
     lasthead = head; 

    head = newObject; 

} 


public void addAtEnd(String name, int age) { 
    Node atEndValue = new Node(name, age); 
    lasthead.next = atEndValue; 
    lasthead = atEndValue; 
} 

原因是,假設如果我從列表的末尾刪除單個節點。我無法將元素添加到列表的末尾。

+0

謝謝!哇!謝啦。你想給我審查我的代碼是多少好和壞只有一個評論我知道這是不正確的時間,但請。 – Shahzad

+0

@BadarShahzadKhan你可以在這裏發佈一個新的問題http://codereview.stackexchange。com/ – iNan

+1

@iNan注意:這段代碼在某些情況下有問題,即列表中只有一個元素。 – simon

0

不要更改連接的L-的頭ist,否則你會失去名單。 嘗試下面的功能修改:

public void deleteFromEnd() { 
     Node start = head; 
     Node prev = null; 
     if(start == null){ 
      return; 
     } 
     if (start.next == null){ 
      head = null; 
      return; 
     } 
     while (start.next != null) { 
      prev = start; 
      start = start.next; 
     } 
     prev.next = null; 
    } 
1

當你從一個單鏈接列表的末尾刪除你要做的事情:

  1. 遍歷列表,並創建一個變量來引用秒到最後你的名單中的元素。

  2. 設置第二到最後一個節點後,該節點爲空

你應該永遠不會改變的head價值,同時遍歷你的鏈接列表,因爲有效地刪除整個列表。自從您覆蓋了您的head變量後,您無法找到自己的方式。相反,使用初始化爲head的臨時變量進行迭代。

最後,別忘了考慮邊緣情況下,該列表只有1元,或者已經是空的:

public void deleteFromEnd() { 
    Node current = head; 
    Node previous = null; 

    while (current != null && current.next != null) { 
     previous = current; 
     current = current.next; 
    } 

    if (current == head) { 
     head = null; 
    } 

    if (previous != null) { 
     previous.next = null; 
    } 
} 
+0

謝謝@nbrooks – Shahzad

相關問題