解析:(快慢指针)
设计一个快指针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;
}
}
该文章描述了一个算法问题,通过创建一个快指针和慢指针在链表中移动,快指针领先n个单位,找到要删除的节点的前一个节点,然后删除它。这个方法处理包括头节点在内的任何位置的删除。关键在于使用虚拟头结点避免直接删除头节点导致的问题,并且在删除后返回新的头节点。

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



