LeetCode
No.19 删除链表的倒数第N个节点
题目:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
Related Topics 链表 双指针
Related Topics
链表 双指针
分析
- 新建两个指针变量
fast
,slow
初始化指向头节点 - 快指针
fast
向后移动n
个节点,使得快慢指针相差为n
,即慢指针指向待删除节点的前一位- 如果
fast
移动到了最后,说明链表的长度等于n
,也就是要删除的是第一个节点,直接返回head.next
- 如果
- 快指针移动到和慢指针相差
n
个节点后,同时移动两个指针,直到快指针移动到最后 - 此时,快指针指向最后,慢指针指向倒数第
(n + 1)
个节点,也就是待删除的前一个 slow.next = slow.next.next;``slow
指向下下个节点(跳过下一个)
图示:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//快慢双指针,快指针指向最后,慢指针指向要删除节点的前一位
ListNode fast, slow;
fast = slow = head;
// 快指针移动n步
//如果移动到了最后说明链表长度和n相等,返回head.next
for (int i = 0; i < n ; i++) {
fast = fast.next;
if (fast == null){
return head.next;
}
}
//同步移动两个指针
while (fast.next != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
}