19.给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
快指针先走n步,之后快慢指针一起走;
快指针走到null,慢指针正好到第n个节点的前驱节点
快指针指向第一个节点,慢指针指向虚拟节点(方便指到前驱节点)
/**
* 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) {
//快慢指针:先让快指针走n步,之后,让快慢指针同时走,直到快指针为null,此时快慢指针正好差n个,
//找到倒数n节点
//建立虚拟头节点,防止第一个节点就是要删除的节点
ListNode nohead = new ListNode(0,head);//这里要用带next的构造器,要把链表连接在一起。
ListNode slow = nohead;//最后递归到链表的,到删除节点的前驱节点
ListNode fast = head;
for(int i=0;i<n;i++){
fast = fast.next;//fast指针前进n步
}
//快慢指针同时前进
while(fast!=null){
fast = fast.next;
slow = slow.next;
}
slow.next =slow.next.next;
return nohead.next;
}
}