解析:(快慢指针)
设计一个快指针fastIndex和一个慢指针slowIndex。fastIndex指向head,slowIndex指向dummy。
快指针fastIndex比慢指针slowIndex领先n个单位。(快指针负责找最后一个元素,慢指针随之找需要删除的元素的前一个元素)
然后一起向后迭代,直到快指针的next指向null,直接删除慢指针后面元素。
注意:
①虚拟头结点:由于由可能删除头结点,需要制造一个虚拟头结点。
②不可以返回head:因为当头结点被删除后,原来的head指向的是被删掉的头结点,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(-1, head);
ListNode fastIndex = head, slowIndex = dummy;
for (int i = 1; i < n; i++) {
fastIndex = fastIndex.next;
}
while (fastIndex.next != null) {
slowIndex = slowIndex.next;
fastIndex = fastIndex.next;
}
slowIndex.next = slowIndex.next.next;
// 不可以返回head,因为当头结点被删除后,原来的head指向的是被删掉的头结点,head已无法作为链表的头指针了
return dummy.next;
}
}