[英]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.