题目链接
两次扫描的方法很好想,第一次数有多少个,第二次定位到要删除的位置
一次遍历的话,用快慢指针:
初始化fast比slow快n-1个位置,两者都不断next
当fast到达末尾,slow的位置恰好就是倒数第n个
再维护一下slow的前一个,用于拼接
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode hair=new ListNode();
hair.next=head;
ListNode slowPre = hair;
ListNode slow = head;
ListNode fast=head;
//fast比slow快n-1个,这样当fast到了末尾,slow指向的就是待删除
for(int i=0;i<n-1;i++){
fast=fast.next;
}
//让fast不断遍历至末尾
while(fast.next!=null){
fast=fast.next;
slowPre=slow;
slow=slow.next;
}
//删除slow位置
slowPre.next=slow.next;
return hair.next;
}
}