从链接列表中删除具有特定值的元素

时间:2020-04-16 00:43:58

标签: javascript algorithm while-loop linked-list

我写的这段代码行得通,但是有两个我无法向自己解释的问题。

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循环中,这两个语句并不相同,有人可以阐明原因吗?

0 个答案:

没有答案