
本题使用双指针的经典做法,设置两个指针fast和slow。
首先需要设置一个虚拟头结点,否则需要判断一个节点时的情况。
其次利用快慢指针,先让快指针移动n次,然后将快慢指针同时移动,直到快指针指向null时停止,此时慢指针指向待删除元素的前一个位置。需要注意的是要提前使用一个pre指针储存原来的慢指针所在的位置,然后直接跳过需要删除的元素将pre指向当前slow.next,最后返回dummy.next。
但是不知道为啥最后返回head节点会显示错误。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0, head);
ListNode fast = dummy;
ListNode slow = dummy;
for (int i = n; i > 0; i --) {
fast = fast.next;
}
ListNode pre = null;
while (fast != null) {
pre = slow;
fast = fast.next;
slow = slow.next;
}
pre.next = slow.next;
return dummy.next;
}
}
该博客讨论了如何使用双指针技巧来解决链表问题,具体是删除链表的倒数第N个节点。通过创建一个虚拟头结点,设置快慢两个指针,先让快指针移动N步,然后同时移动快慢指针,直至快指针到达链表末尾。此时慢指针指向的目标是待删除节点的前一个位置,通过更新前一个节点的next指针来完成删除操作。但博主在实现过程中遇到了返回头节点导致错误的问题。
763

被折叠的 条评论
为什么被折叠?



