删除链表的倒数第N个结点
题目描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
提示:
- 链表中的结点的数目为sz
- 1 <= sz <= 30
- 0 <= Node.val <= 100
- 1 <= n <= sz
代码
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 dummyHead = new ListNode();
dummyHead.next = head;
// 可以使用两个指针,先让快指针往后移动n个位置,然后慢指针和快指针同时移动,直到快指针指向null,此时慢指针指向的是倒数第n个元素
// 由于要删除元素,所以我们需要指向要删除元素的前一个元素
// 所以可以将快指针再往后移动一个元素,也就是总共移动n+1个位置
ListNode slow = dummyHead;
ListNode quick = dummyHead;
n++;
while(n-- != 0) {
quick = quick.next;
}
// 快慢指针同时移动
while(quick != null) {
slow = slow.next;
quick = quick.next;
}
slow.next = slow.next.next;
return dummyHead.next;
}
}