19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
思路:
删除一个结点需要找到这个结点的上一个位置。由于可能会删除头结点,所以需要dummy结点。
使用两个指针 p1 和 p2,p2指向dummy。
先移动p1,使得p1和p2之间的距离为 n 。
然后再同时移动 p1 和 p2,这样当 p1 到达结尾处的时候,由于 p1 和 p2 之间的距离是 n ,此时 p2 的位置正好是倒数第 n 个结点的上一个位置,可以方便地进行删除操作。
总结:
使用两个指针,通过两个指针之间相距 n ,遍历一轮就找到了倒数第 n 个位置的上一个位置。
代码:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0, head);
ListNode p1 = head, p2 = dummy;
// p1 先从头结点开始移动n步,使得 p1 和 p2 相隔 n 步
while(n > 0 && p1 != null) {
n--;
p1 = p1.next;
}
// p1 和 p2 同时走, p1 走到结尾的时候,p2 就在倒数第n个位置的前一个结点
while(p1 != null) {
p1 = p1.next;
p2 = p2.next;
}
// 删除倒数第n个结点
p2.next = p2.next.next;
// 返回删除后的头结点
return dummy.next;
}
}
参考: