思路:
首先,可以先遍历一遍得到链表长度,再寻找待删除的节点。
一遍循环的实现方法:
两个指针first和second,first先于seconnd指针n步,即first指针先后移n步,然后二者再同步后移,这样first指针到达链表末尾时,second指针恰好来到需要删除的节点。
同时,为了便于删除操作,我们最好找到需要删除节点的前驱节点,所以可以建立一个伪节点指向head节点,把second初始化为该伪节点,这样按照上述方法移动完成后就可以得到待删除节点的前驱节点,方便删除。
代码:
/**
* 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 fake = new ListNode(0, head);
ListNode first = head;
ListNode second = fake;
for (int i = 0; i < n; i++) {
first = first.next;
}
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return fake.next; // 不能return head,因为有可能删除的是头节点
}
}