19. 删除链表的倒数第N个节点
查看题目中等
链表
中频
解法一:双指针
时间复杂度:O(n) | 空间复杂度:O(1) | 推荐使用
动画演示
删除链表的倒数第N个节点 - 双指针算法
0
Dummy
操作日志
代码实现
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 创建哑节点,方便处理头节点可能被删除的情况
ListNode dummy = new ListNode(0);
dummy.next = head;
// 初始化快慢指针
ListNode fast = dummy;
ListNode slow = dummy;
// 快指针先前进n+1步
for (int i = 0; i <= n; i++) {
fast = fast.next;
}
// 快慢指针同时前进,直到快指针到达链表末尾
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
// 此时慢指针指向要删除节点的前一个节点,执行删除操作
slow.next = slow.next.next;
return dummy.next;
}
}时间复杂度:O(n)
空间复杂度:O(1)