19. 删除链表的倒数第N个节点
- 删除链表的倒数第N个节点
难度中等885
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
//快慢指针,这块删除不难,主要是要处理好 1->2 删除1这样的问题。
//所以需要设定一个前置指针,至于为什么fast 和 slow要指向pre
//1>2>3>4>5 fast指向1的话 先走2步 到达3位置。
//slow指向1 和 fast并行走 fast到5的位置走不动 slow走到3 然后删除4 没有问题。
//但是当删除头结点 1 就没有办法了。必须有一个前置指针指向1 所以是需要添加一个前置指针的Pre。
//时间复杂度为O(n) 空间复杂度O(1)
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = new ListNode(0);
pre.next = head;
ListNode fast = pre, slow = pre;
while(n!=0){
fast = fast.next;
n--;
}
while(fast.next!=null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return pre.next;
}