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值就会在整个链表中删掉。