题目:删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第n
个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
解题思路:
解决这个问题焦点在于如何找到倒数的那个点,然后题目让我们尝试扫描一次去实现,那么应该如何去找到它呢,思路如下:
- 定义两个指针
p
和q
,q
指向虚拟接点,p
指向q
后的第n
个节点,如下图: - 然后进行水平扫描,如果
p
的下一位不为空则p
和q
指向下一位
不断重复移动,当p
的下一位指向null
时,q
下一位指向的点就是倒数第n
点 - 然后缓存要删除的节点
delnode
,就是q
的下一位,把q
的下一位指向delnode
的下一位,删除倒数第n
个节点完成
代码实现:
const removeNthFromEnd = function (head, n) {
if (n <= 0 || !head) {
return
}
let dummyHead = new ListNode(null);
dummyHead.next = head;
let p = dummyHead, q = dummyHead;
while (n--) {
p = p.next;
if (!p) {
return null
}
}
while (p.next) {
p = p.next;
q = q.next
}
let delNode = q.next;
q.next = delNode.next;
delNode = null;
let retNode = dummyHead.next;
dummyHead = null;
return retNode
};