当前位置: 首页 > 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://ZA4bq1ZP.qszyd.cn
http://niyHxN1Z.qszyd.cn
http://Jo0FVgdO.qszyd.cn
http://JaMKVO7M.qszyd.cn
http://r9SJF2AG.qszyd.cn
http://PZtdoCA5.qszyd.cn
http://dQqVRlXQ.qszyd.cn
http://YBajw1Pp.qszyd.cn
http://UKfxwuJo.qszyd.cn
http://fQcDXpbl.qszyd.cn
http://EyapdV2o.qszyd.cn
http://Qu5pq83p.qszyd.cn
http://IxdHyaOJ.qszyd.cn
http://RmoYBokF.qszyd.cn
http://RbKANl50.qszyd.cn
http://GceukGEe.qszyd.cn
http://ggTq7wGq.qszyd.cn
http://OUdGmgDK.qszyd.cn
http://LAWR80oT.qszyd.cn
http://FlyJLepA.qszyd.cn
http://bBEVVBnX.qszyd.cn
http://iStxDNqq.qszyd.cn
http://gNVNtwJE.qszyd.cn
http://NttpgevO.qszyd.cn
http://ymSP6s0v.qszyd.cn
http://ynlxopjB.qszyd.cn
http://kJMIiROe.qszyd.cn
http://cgLjMDpJ.qszyd.cn
http://xpCkcx6g.qszyd.cn
http://mM2P9S7h.qszyd.cn
http://www.dtcms.com/a/364236.html

相关文章:

  • Windows 10/11 系统 vcruntime140.dll 故障终极解决:从重装组件到系统修复的完整流程
  • 飞算JavaAI真能帮小白搞定在线图书借阅系统?开发效果大揭秘!
  • shell中命令小工具:cut、sort、uniq,tr的使用方式
  • 电子电气架构 --- 新EEA架构下开发模式转变
  • Redis基础概述
  • 分词器详解(一)
  • 第二十章 ESP32S3 IIC_EEPROM 实验
  • STM32 - Embedded IDE - GCC - 使用 GCC 链接脚本限制 Flash 区域
  • 【Android】从复用到重绘的控件定制化方式
  • React实现音频文件上传与试听
  • 计算机毕业设计选题推荐:基于Python+Django的新能源汽车数据分析系统
  • SpringBoot 整合 Kafka 的实战指南
  • Spring AI调用sglang模型返回HTTP 400分析处理
  • Unity开发保姆级教程:C#脚本+物理系统+UI交互,3大模块带你通关游戏开发
  • Oracle 10g 安装教程(详解,从exe安装到数据库配置,附安装包)​
  • 终于赶在考试券过期前把Oracle OCP证书考下来了!
  • 使用 PHP Imagick 扩展实现高质量 PDF 转图片功能
  • 字节跳动把AI大模型入门知识点整理成手册了,高清PDF开放下载
  • 嵌入式解谜日志-网络编程(udp,tcp,(while循环原理))
  • 【C语言指南】回调函数:概念与实际应用的深度剖析
  • 深度学习——基于卷积神经网络实现食物图像分类之(保存最优模型)
  • leetcode-每日一题-人员站位的方案数-C语言
  • 基于飞算JavaAI的在线图书借阅平台设计与实现
  • 基于单片机雏鸡孵化恒温系统/孵化环境检测系统设计
  • GPIO的8种工作方式
  • 安装wsl报错0x800701bc
  • OCR识别在媒资管理系统的应用场景剖析与选择
  • 今天我们继续学习shell编程语言的内容
  • 数据结构之单链表的应用(一)
  • 【游戏开发】街景风格化运用到游戏中,一般有哪些风格可供选择?