题目链接
思路:快慢指针
分析:倒数第N个节点,最简单的做法就是先数一下一共有几个节点,然后再去操作。
这里是用的是利用一个先行指针,一个后行指针,他们之间的间隔就是n-1个节点,也就是说后行指针比先行指针慢n-1个节点。
当先行指针到了最后一个节点的时候,那么后行指针就正好在第到数n+1个节点上。
这样的好处在于不需要去计算一共多少个节点了。
代码:
/**
* 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 fast=head;
//后行指针
ListNode slow=head;
//先行指针先走n步,那么与后行指针间隔就是n-1个节点了
while(n>0){
fast=fast.next;
n--;
}
//如果此时先行指针走完了这个链表,说明删除的是头节点
if(fast==null){
return head.next;
}
while(fast.next!=null){
fast = fast.next;
slow = slow.next;
}
slow.next=slow.next.next;
return head;
}
}