当前位置: 首页 > news >正文

代码随想录算法训练营第四天|链表part02

24. 两两交换链表中的节点

题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode)

文章讲解:代码随想录

方法一:交换值

/*** 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* swapPairs(ListNode* head) {ListNode*curNode=head;while( curNode&&curNode->next){//这里不能仅判断curNode->next 因为curNode是空ListNode* nextNode=curNode->next;int curV=curNode->val;curNode->val=nextNode->val;nextNode->val=curV;curNode=nextNode->next;}return head;}
};

错误代码:


class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode*dummyNode=new ListNode;dummyNode->next=head;ListNode*curNode=dummyNode;while( curNode->next&&curNode->next->next){auto temp=curNode->next;auto temp1=curNode->next->next->next;temp->next=temp1;//这里提前绑定 会出现回路导致超时curNode->next=curNode->next->next;curNode->next->next=temp;// curNode->next->next->next=temp1;curNode=curNode->next->next;}auto ans=dummyNode->next;delete dummyNode;return ans;}
};

正确解答:

class Solution {
public:ListNode* swapPairs(ListNode* head) {//虚拟头节点ListNode*dummyNode=new ListNode;dummyNode->next=head;ListNode*curNode=dummyNode;while( curNode->next&&curNode->next->next){//交换auto temp=curNode->next;auto temp1=curNode->next->next->next;curNode->next=curNode->next->next;curNode->next->next=temp;curNode->next->next->next=temp1;curNode=curNode->next->next;}auto ans=dummyNode->next;//这里是必须的 因为头指针会被换到后一个去了delete dummyNode;return head;}
};

19.删除链表的倒数第N个节点

题目链接:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

文章讲解:代码随想录

思路:

遍历一遍链表 统计有多少个节点 然后再计算出被删除节点前一个节点的编号

遍历到被删除节点前一个节点  然后再进行删除操作

/*** 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;auto cur=dummyHead;int length=0;while(cur){length++;cur=cur->next;}auto pre=dummyHead;int count=length-n-1;while(count--){pre=pre->next;}if(pre&&pre->next){pre->next=pre->next->next;}auto ans=dummyHead->next;delete dummyHead;return ans;}
};

事实上 有更好的方法 这题是典型的应用快慢指针的方法

快指针先走n步

然后快慢指针一起走

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {auto dummyHead=new ListNode(0);dummyHead->next=head;auto slow=dummyHead;auto fast=dummyHead;while(n--){fast=fast->next;}while(fast->next){slow=slow->next;fast=fast->next;}slow->next=slow->next->next;return dummyHead->next;}
};

面试题 02.07. 链表相交

题目链接:面试题 02.07. 链表相交 - 力扣(LeetCode)

文章讲解:代码随想录

思路:

也是用快慢指针

先分别求两个链表的长度

然后比较长度 长的先走

然后再一起走 判断当前指针是否相同


class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {int lengthA=0;auto curA=headA;while(curA){lengthA++;curA=curA->next;}int lengthB=0;auto curB=headB;while(curB){lengthB++;curB=curB->next;}if(lengthA>=lengthB){int dis=lengthA-lengthB;while(dis--){headA=headA->next;}while(headA){if(headA==headB)return headA;headA=headA->next;headB=headB->next;}}else{int dis=lengthB-lengthA;while(dis--){headB=headB->next;}while(headA){if(headA==headB)return headA;headA=headA->next;headB=headB->next;}}return NULL;}
};

142.环形链表II

题目链接:142. 环形链表 II - 力扣(LeetCode)

文章讲解:代码随想录

思路:

同样是用快慢指针

快指针每次走两格,慢指针每次走一格。

有环一定会相遇

无环则不会相遇

假设相遇的地方在E

从头到环入口的距离为x

从入口到相遇的距离为y

从相遇到入口的距离为z

可以推出:

x=(n-1)(y+z)+z

说明此时 在相遇的地方定义一个指针index1

头定义一个指针index2

两者一起走 他们相遇的地方就是环的入口

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {auto fast=head;auto slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(slow==fast){//相遇auto index1=slow;auto index2=head;while(index1!=index2){ //一起移动index1=index1->next;index2=index2->next;}return index1;}}return NULL;}
};

http://www.xdnf.cn/news/1449469.html

相关文章:

  • SQLint3 模块如何使用
  • PostgreSQL 技术峰会哈尔滨站活动回顾|深度参与 IvorySQL 开源社区建设的实践与思考
  • 农业XR数字融合工作站,赋能农业专业实践学习
  • 刻意练习实践说明使用手册
  • 正则表达式的使用
  • Java jar 如何防止被反编译?代码写的太烂,害怕被人发现
  • TDD测试驱动开发+Python案例解析
  • 在linux下使用MySQL常用的命令集合
  • 通义实验室发布AgentScope 1.0新一代智能体开发框架
  • 嵌入式第四十二天(数据库,网页设计)
  • Spring Boot集成Kafka常见业务场景最佳实践实战指南
  • Java全栈工程师的面试实战:从基础到复杂问题的完整解析
  • 安卓APP备案的三要素包名,公钥,签名md5值详细获取方法-优雅草卓伊凡
  • 鹧鸪云软件:光伏施工管理一目了然,进度尽在掌握
  • 涉私数据安全与可控匿名化利用机制研究(下)
  • Selenium WebUI 自动化“避坑”指南——从常用 API 到 10 大高频问题
  • 本地化AI问答:告别云端依赖,用ChromaDB + HuggingFace Transformers 搭建离线RAG检索系统
  • 科技信息差(9.3)
  • uni app 的app端 写入运行日志到指定文件夹。
  • Linux学习:生产者消费者模型
  • 开源 C++ QT Widget 开发(十一)进程间通信--Windows 窗口通信
  • AI 大模型 “内卷” 升级:从参数竞赛到落地实用,行业正在发生哪些关键转变?
  • 2025年经济学专业女性职业发展证书选择与分析
  • SCN随机配置网络时间序列预测Matlab实现
  • @Resource与@Autowired的区别
  • 数据结构——顺序表和单向链表(2)
  • 【Android】【设计模式】抽象工厂模式改造弹窗组件必知必会
  • Wan2.2AllInOne - Wan2.2极速视频生成模型,4步极速生成 ComfyUI工作流 一键整合包下载
  • 深度学习篇---模型组成部分
  • http和https区别是什么