
java
/**
* 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);
dummy.next = head;
ListNode fast = dummy;
ListNode slow = dummy;
//让快指针先走,和慢指针维持n+1的距离
for(int i = 0; i <= n; i++){
fast = fast.next;
}
//同步前进
while(fast != null){
fast = fast.next;
slow = slow.next;
}
//删除节点
slow.next = slow.next.next;
return dummy.next;
}
}
要求使用一趟扫描实现,所以不能不能先遍历一遍得到长度,然后再从头遍历删除指定节点。
所以使用快慢指针的方法,让慢指针先前进n+1步,然后再同步前进,等快指针指向null的时候,即可删除指定指针;同时使用哨兵节点,如果刚好删除的是头节点,慢指针没有所删除节点前一个位置,也就没法删除。