Удаление элементов из связанного списка с указанным значением c - PullRequest
0 голосов
/ 16 апреля 2020

У меня написан этот код, который работает, но у меня есть два вопроса, которые я не могу объяснить самому себе.

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 эти два утверждения не совпадают, кто-то может объяснить, почему?

...