本题使用双指针的经典做法,设置两个指针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;
}
}