1. 题目
题目链接: 19. 删除链表的倒数第 N 个结点.
2. 思路
- 双指针:定义两个指针,fast和slow,先让fast向前移动N次,然后再一起移动到fast为最后一个节点,此时slow在被删除的倒数第N个节点的前一个节点,只需要slow.next = slow.next.next即可。
当被删除的是head的时候,即N与链表的节点数量一样的时候,此时移动完成后,fast已经为null,因此只需要将head向后移动一次即可,即head = head.next;
3. 代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head.next == null) return null;
// 定义两个指针
ListNode slow = head;
ListNode fast = head;
// 让快的指针前进n个
while (n > 0) {
fast = fast.next;
n--;
}
// 同时移动slow和fast到链表末尾
while (fast != null && fast.next != null) {
fast = fast.next;
slow = slow.next;
}
// 如果删除的是头结点则单独考虑
if (fast == null) head = head.next;
else slow.next = slow.next.next;
return head;
}
}