leetCode题解——19

98 阅读1分钟

leetCode题解——19

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 原题链接

先明确,删除倒数第 n 个结点,我们需要找到倒数第 n+1 个结点,删除其后继结点即可。 1.添加 dummy 哨兵结点,处理边界问题。
2.借助快慢指针,快指针先走 n+1 步,然后快慢指针同步往前走,直到 fast.next 为 null。
3.删除倒数第 n 个结点,返回 dummy.next。

const removeNthFromEnd = function(head, n) {
    const dummy = new ListNode(0, head)
    let forward = dummy, backward = dummy
    while (n--) {
        forward = forward.next
    }
    while (forward.next) {
        forward = forward.next
        backward = backward.next 
    }
    backward.next = backward.next.next
    return dummy.next
}

题解的理解难点在于对快慢指针的指向的理解和寻找到对应节结点。题解的两个循环里改变的都是快慢指针forward和backward的指向。第一个while里面执行了三次forward的指向分别为dummy.next、dummy.next.next、dummy.next.next.next。第二个while里面执行了两次forward的指向分别为dummy.next.next.next.next、 dummy.next.next.next.next.next;backward的指向为dummy.next、dummy.next.next; 两次while的操作是为了找到对应的要操作的结点。backward.next = backward.next.next。其实就是对dummy.next.next.next进行操作,将其指向dummy.next.next.next.next;所以该节点上的val值就会在整个链表中删掉。