我写的这段代码行得通,但是有两个我无法向自己解释的问题。
class ListNode {
constructor(val) {
this.val = val
this.next = null
}
}
const removeElements = (head, val) => {
if (!head) return null // if no head
let dummy = new ListNode('dummy') // dummy node
dummy.next = head // to connect to the list
head = dummy // point head to dummy
while (dummy.next !== null) { // why is this not the same as while (!dummy.next)
if (dummy.next.val === val) dummy.next = dummy.next.next
else dummy = dummy.next
}
return head.next
}
const L1 = new ListNode(1)
L1.next = new ListNode(2)
L1.next.next = new ListNode(6)
L1.next.next.next = new ListNode(6) // this node confuses me
L1.next.next.next.next = new ListNode(4)
L1.next.next.next.next.next = new ListNode(5)
L1.next.next.next.next.next.next = new ListNode(6)
console.log(removeElements(L1, 6))
第一个问题是值是6的节点。我知道它将进入next.next
节点,但是我似乎无法弄清楚代码对于两个连续值6的工作方式。我希望它在L1.next.next.next
上落在6上而不删除它;但是,确实如此,我似乎无法理解。
第二个问题是关于while循环。我印象中while (dummy.next !== null)
和while (!dummy.next)
是同义词。我已经使用这种确切的逻辑为其他几个算法问题编写了代码,只是没有在while循环中,它的行为始终如预期;但是,在while循环中,这两个语句并不相同,有人可以阐明原因吗?