2016-04-04 65 views
1

我正在閱讀算法以刪除單個鏈接列表中的最後一個元素。 假設我有一個鏈表對象調用ListNode:如何從Java中單獨鏈接列表中刪除尾部

public class ListNode { 
    private int data; 
    private ListNode next; 

    public ListNode(int data) { 
     this.data = data; 
    } 

    public int getData() { 
     return this.data; 
    } 

    public void setData(int data) { 
     this.data = data; 
    } 

    public ListNode getNext() { 
     return this.next; 
    } 

    public void setNext(ListNode next) { 
     this.next = next; 
    } 
} 

我發現清單中刪除的最後一個節點的方法是:

public ListNode deleteAtTail(ListNode head) { 

    if (head == null || head.next == null) return null; 
    ListNode node = head; 
    while(node.next.next != null) { 
     node = node.next; 
    } 

    node.next = null; 
    return head; 
} 

我困惑如何代碼工作,因爲一切是通過「節點」。但是,當返回頭部時,最後一個節點被刪除。 因此,我不知道它是如何工作的,它是否與Java中的「按值傳遞」相關?

回答

4

您遍歷列表的node s,直到node.next.next爲空。 此時,node是指倒數第二個節點,而node.next是指最後一個節點。將node.next設置爲null將從列表中刪除最後一個節點,因爲列表中沒有節點再引用它。

+0

但是一切都經歷了變量「節點」而不是「頭」。那麼當將變量「node」的next節點設置爲null時,如何刪除head的最後一個元素。 –

+0

'head'指列表中的第一個節點,它指向第二個節點,它指向第三個節點,....指向最後一個節點的下一個節點,它指向最後一個節點。如果您更改這些指針中的任何一個(例如更改下一個節點的指針),則可以更改列表。 – Eran

+0

非常感謝,我終於發現它爲什麼發生了。 –

1

您可以注意到該方法遍歷所有節點,直到倒數第二個節點,因爲最後一個節點的next將爲null

while(node.next.next != null) { 
    node = node.next; 
} 

上面的代碼將會給你倒數第二個節點,其下是使用node.next = null;這意味着第二個最後一個節點,現在將成爲最後一個節點設置爲null

0

由於沒有一個答案是清楚的(在我看來,也是正確的,因爲如果我們有node.next.next並且我們只有一個元素,我們將得到一個NullPointerException),我想給我兩分錢。

有3種情況:

  1. 列表爲空。直截了當,返回null,或打印該列表爲空。
  2. 列表中有1項。我們無法知道這不計算(或我們可以?),但看看下面的代碼
  3. 列表有多個項目。瀏覽列表併爲前一個添加一個臨時變量,然後在達到最後時將previous.next設置爲null。

所以,我的方法是有一個初始的先前變量設置爲空(想象你在列表的開始之前)。然後,在while循環中,如果有1項,它不會執行任何命令(它會跳過它,分組將是無效),否則,你就同第3點下面的代碼:

if(head == null) return; 
    ListNode iterator = head; 
    ListNode prev = null; 
    while(iterator.next !=null) { 
     prev = iterator; 
     iterator=iterator.next; 
    } 
    if(prev == null) head = null; 
    else prev.next = null; 

希望這有助於。