💫感觉自己刷题越来越快了φ(* ̄0 ̄)(也是此题思路通了就很好写✍)
📆学习日期:2025年1月21日22:19:35 | 2025年1月21日23:18:43
💻学习内容:删除链表的倒数第N个节点代码随想录
⏲️学习时长:1h
练习题目
题目描述
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
中等
给你一个链表,删除链表的倒数第 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
个节点,删除它 - 删除节点的关键:操作的指针
cur
要指向需要删除的指针的上一个节点 - 使用
dummyHead
- 双指针
fast
,slow
:fast
指针先移动n+1
步,随后fast
,slow
指针同时移动,fast
指向null
时,slow
指向倒数第n+1
个节点,进行删除倒数第n
个节点的操作。 使用双指针找到倒数第n个节点
- (
slow
比fast
少走n+1)
- 代码实现
new
dummyHead
fast
指针先走n+1
步
n++;
while(n--&&fast!=null)
//n+1
步
fast
指针与slow
指针同时移动
while(fsat!=null)
- 删除节点
- 释放内存
return dummyHead->next
//2025年1月21日22:55:56
//2025年1月21日23:06:34
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next=head;
ListNode* fast=dummyHead;
ListNode* slow=dummyHead;
n++;
while(n--&&fast!=nullptr){//移动快指针
fast=fast->next;
}
//第2个条件fast!=nullptr是为了避免单节点的操作出现异常:head=[1],n=1;
//可自己尝试,真的会报错-_-||
while(fast!=nullptr){//快慢指针同时移动
fast=fast->next;
slow=slow->next;
}
ListNode* temp=slow->next;
slow->next=slow->next->next;//删除倒数第n个节点
delete temp;//释放内存
temp=nullptr;
return dummyHead->next;
}
};
学习总结
- 双指针的妙用:一趟扫描完成删除操作😏
while(n--&&fast!=nullptr){//移动快指针
- C++中while循环的形式 不熟悉
fast!=nullptr
的用意 粗略理解