🚩传送门:牛客题目
题目
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:![[NC]53. 删除链表的倒数第n个节点 - 图1](/uploads/projects/mylearn@leetcode/18eb13107d1d8a341f3bad20cb2be670.jpeg)
输入: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 个结点,然后落后的慢指针和快指针一起跑
- 慢指针 **pre **正常指向的是删除结点的前一个结点- 当 **cur **跑完 **n** 步变成 `null` ,慢指针 **pre **指向的就是要删除的 **head** 结点
图:快指针先跑 n 步,指向第 n+1 个结点
图:当 cur 跑完 n 步变成 null ,慢指针 pre 指向的就是要删除的 head 结点
图:正常慢指针 pre 指向的是要删除结点的前一个结点
我的代码
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode cur=head;ListNode pre=head;//1.快指针先跑 n 个for(int i=0;i<n;i++){cur=cur.next;}//2.如果 cur 为空说明head就是要删除的结点if(cur==null){return head.next;}//3.如果 cur.next==null , pre就是要删除的前一个结点while(cur.next!=null){cur=cur.next;pre=pre.next;}//4.删除pre的下一个结点pre.next=pre.next.next;return head;}}
