У меня написан этот код, который работает, но у меня есть два вопроса, которые я не могу объяснить самому себе.
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. Я понимаю, что оно будет go к узлу next.next
, но я не могу понять, как работает код для двух последовательных значений 6. Я ожидаю, что при L1.next.next.next
он попадет на 6 и не удалит его; однако, это так, и я не могу понять, как.
Второй вопрос касается пока l oop. Я был под впечатлением while (dummy.next !== null)
и while (!dummy.next)
были синонимами. Я написал код для нескольких других проблем с алгоритмом, используя эту точную логику c, но ненадолго l oop, и она всегда вела себя как предсказано; однако в то время как l oop эти два утверждения не совпадают, кто-то может объяснить, почему?