簡體   English   中英

Single LinkedList刪除最后一個節點

[英]Single LinkedList Remove Last Node

我的教授用這個程序給我,當節點p到達最后一個節點時,它不應該退出循環嗎? 如何刪除最后一個節點?

| ____ | ---> | ____ | ---> | 這里 | ---> | NULL |

當P到達最后一個節點時。 它滿足p.next!= null。 因此,它永遠無法刪除最后一個節點。

教授提供的程序

盡管外部for循環會一直到倒數第二個元素說出p,但其中的if條件“ p.next.element.equals(e)”會檢查p之后的元素,即p倒數第二個元素時的最后一個元素。 因此,您檢查要刪除的元素實際上是p.next,而p始終保持指向前一個元素的指針。 這樣p.next = p.next.next最終刪除了p.next。

for loop的文檔,這是關於增量操作的說明:

每次循環迭代后都會調用增量表達式。 對於該表達式,增加或減少值是完全可以接受的。

因此,在您的情況下, p = p.next在迭代完成后執行。 因此,在刪除9時, p實際上會在4上,因此, p.next != null不會失敗。

當P到達倒數第二個節點時:

|____|--->|P = HERE|--->|__e__|--->|NULL| //3 elements

並且e是最后一個節點(例如),然后p.next.element.equals(e)變為true,然后發生這種情況:

|____|--->|P = HERE|--->|NULL|<---|__e__|

此時,您具有2個元素鏈接列表,並且刪除了最后一個節點。

您上面發布的方法確實可以刪除最后一個元素。 讓我們追溯代碼,並假裝我們試圖刪除節點9。

Method remove() is called
p = head
First iteration:
p.next.element = 7 which doesn't equal 9
p = p.next which is node 7
Second iteration:
p.next.element = 4 which doesn't equal 9
p = p.next which is node 4
Third iteration:
p.next.element = 9 which equals 9 so now the if statement body gets executed
p points at node 4 so the result of the if statement is

Before:
head -> 7 -> 4 -> 9 -> null
After:
head -> 7 -> 4 -> null

Loop breaks and the method is over

請注意,節點9已被Java的垃圾回收刪除,因為現在沒有指向節點9的內容,因此無法訪問它。

但是,我唯一遇到的問題是記住確保檢查head是否為null。 否則,該方法將獲得NullPointerException。

我想我明白為什么這會造成混淆。

變量p在遍歷列表時將指向特定的Node。 head節點開始。 根據該圖, head節點不包含任何數據-它僅指向包含數據的第一個節點。 如果條件實際上是評估下一個節點中的值。 因此,當您從列表中刪除最后一個節點時,循環變量p將指向倒數第二個節點。

使用發布的示例(List包含值7,4,9)並嘗試刪除值9(它是List的最后一個元素)。 p指向包含4的Node時,if條件將在p.next.element找到9。 因此它將p.next下一個變量更改為指向p.next.next (由於p.next是最后一個節點,因此為null)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM