🚩传送门:牛客题目

题目

给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:
[NC]53. 删除链表的倒数第n个节点 - 图1

输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1 输出:[]

示例 3:

输入:head = [1,2], n = 1 输出:[1]


解题思路:双指针

设置两个快慢指针,快指针先跑 n 个结点,然后落后的慢指针和快指针一起跑

  1. - 慢指针 **pre **正常指向的是删除结点的前一个结点
  2. - **cur **跑完 **n** 步变成 `null` ,慢指针 **pre **指向的就是要删除的 **head** 结点

图:快指针先跑 n 步,指向第 n+1 个结点
image.png
图:cur 跑完 n 步变成 null ,慢指针 pre 指向的就是要删除的 head 结点
image.png
图:正常慢指针 pre 指向的是要删除结点的前一个结点
image.png

我的代码

  1. class Solution {
  2. public ListNode removeNthFromEnd(ListNode head, int n) {
  3. ListNode cur=head;
  4. ListNode pre=head;
  5. //1.快指针先跑 n 个
  6. for(int i=0;i<n;i++){
  7. cur=cur.next;
  8. }
  9. //2.如果 cur 为空说明head就是要删除的结点
  10. if(cur==null){
  11. return head.next;
  12. }
  13. //3.如果 cur.next==null , pre就是要删除的前一个结点
  14. while(cur.next!=null){
  15. cur=cur.next;
  16. pre=pre.next;
  17. }
  18. //4.删除pre的下一个结点
  19. pre.next=pre.next.next;
  20. return head;
  21. }
  22. }