我找到了一種演算法來遍歷排序的鏈表并洗掉重復項。我寫了它,它有效。
不過,我不明白這怎么能作業。在回圈結束時,要前進到 while 回圈,我們這樣做:
currentNode = nextNode
這怎么能不擦除當前節點?為什么鏈表還在?感覺每一個節點都被下一次擦除,不是嗎?
class LinkedList {
constructor(value) {
this.value = value;
this.next = null;
}
}
function removeDuplicatesFromLinkedList(linkedList) {
let currentNode = linkedList;
while(currentNode !== null){
let nextNode = currentNode.next;
while(nextNode !== null && nextNode.value === currentNode.value){
nextNode = nextNode.next;
}
currentNode.next = nextNode
currentNode= nextNode
}
currentNode = linkedList;
return linkedList;
}
exports.LinkedList = LinkedList;
exports.removeDuplicatesFromLinkedList = removeDuplicatesFromLinkedList;
uj5u.com熱心網友回復:
實際上,linkedList永遠不會被覆寫,因此初始串列不會損壞(因為洗掉重復項時,保留第一個,僅洗掉以下串列)。
那么,currNode就是當前指標,指向當前節點。為其分配新值不會洗掉前一個節點,因為它仍然通過串列 head 參考linkedList。
真正缺少的是free已洗掉節點上的指令 - 該演算法依賴垃圾收集器來作業而不會發生記憶體泄漏。
uj5u.com熱心網友回復:
讓我們通過一個例子來做到這一點:
2 -> 3 -> 3 -> 4
最初currentNode == 2. 在回圈的第一次迭代中nextNode == 3,它是當前節點的下一個節點。內部 while 回圈不運行,因為currentNode.value不等于nextNode.value. 所以我們打:
currentNode.next = nextNode
currentNode= nextNode
這將下一個節點設定currentNode為NextNode。所以,什么都沒有改變。然后我們將當前節點向前移動一個:currentNode = nextNode
不過,在下一次迭代中,nextNode == 3, whilecurrentNode == 3也是。現在內部 while 回圈運行一次迭代并移動nextNode到 4 并中斷,因為它們不再相等。然后,currentNode.next設定為nextNode,即 4,之后nextNode分配給currentNode。
由于這些都是指向節點的指標,因此沒有任何內容被擦除。只是從鏈接節點鏈中洗掉重復值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/452497.html
下一篇:在包含一組節點的圖中搜索最小回圈
