代码随想录算法训练营day4 | 链表(2)

一、LeetCode 24 两两交换链表中的节点

题目链接:24.两两交换链表中的节点icon-default.png?t=N7T8https://leetcode.cn/problems/swap-nodes-in-pairs/

思路:设置快慢指针,暂存节点逐对进行交换。

代码优化前:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null){return head;}//头部结点交换ListNode cur = head;         //cur存储节点1ListNode now = cur.next;    //now存储节点2ListNode temp_n = now;       //暂存节点2ListNode temp_c = now.next;  //暂存下一轮的节点_1now.next = cur;              //节点2 → 节点1head = now;                  //head - 节点2now = cur;                   //now - 节点1cur.next = temp_c;           //节点1 → 节点_1cur = temp_c;                //cur - 节点_1//while循环中逻辑与上同while(cur != null && cur.next != null){temp_n = now;now = cur.next;temp_n.next = now;temp_c = now.next;now.next = cur;now = cur;cur.next = temp_c;cur = temp_c;}return head;}
}

代码优化后:

二、LeetCode 19 删除链表的倒数第N个节点

题目链接:19.删除链表的倒数第N个节点icon-default.png?t=N7T8https://leetcode.cn/problems/remove-nth-node-from-end-of-list/

思路:考虑使用快慢指针。先处理特殊情况(单节点链表或删除头结点);快慢指针同时后移、找到要删除节点的前一个节点做删除处理。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//单个元素if(head.next == null){return null;}ListNode slow = head;ListNode fast = head;//删除倒数第n个节点、快指针先行n步while(fast != null && n > 0){fast = fast.next;n--;}//fast先行n步到链表末尾,说明要删除第一个节点if(fast == null){return head.next;}//slow指针与fast指针同时后移,找到要删除节点的前一个节点//(所以是fast.next!=null 而不是fast != null)while(fast.next != null){slow = slow.next;fast = fast.next;}//删除节点slow.next = slow.next.next;return head;}
}

 三、LeetCode 面试题 02 07 链表相交

题目链接:面试题02.07.链表相交icon-default.png?t=N7T8https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/

思路:

计算链表A、B长度、并把指针移动到链表结尾;利用链表A、B长度差,调整较长链表的遍历指针到剩余长度与较短链表的长度相同的位置;A、B遍历指针同步后移,找到相交位置。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode index_a = headA;ListNode index_b = headB;//处理链表A、B为空的情况if(index_a == null || index_b == null){return null;}//计算链表A、B长度、并把指针移动到链表结尾int len_a = 1,len_b = 1;while(index_a != null && index_a.next != null){index_a = index_a.next;len_a++;}while(index_b != null && index_b.next != null){index_b = index_b.next;len_b++;}//结尾指针指向的节点不同,说明不相交if(index_a != index_b){return null;}//指针回到头部index_a = headA;index_b = headB;//利用链表A、B长度差,调整较长链表的遍历指针到剩余长度与较短链表的长度相同的位置//A、B遍历指针同步后移,找到相交位置if(len_a > len_b){int num = len_a - len_b;while(num > 0){index_a = index_a.next;num--;}while(index_a != index_b){index_a = index_a.next;index_b = index_b.next;}}else{int num = len_b - len_a;while(num > 0){index_b = index_b.next;num--;}while(index_a != index_b){index_a = index_a.next;index_b = index_b.next;}}return index_a;}
}

 四、LeetCode 142 环形链表II

题目链接:142.环形链表IIicon-default.png?t=N7T8https://leetcode.cn/problems/linked-list-cycle-ii/description/

思路:

        先判断是否有环:设置快慢指针fast、slow。在每个循环中,fast后移2次、slow后移1次,作图可知,若链表有环,则fast与slow必然能够相遇且必定在环内相遇。

        再确定环入口:设head到环入口的长度为x,环入口到fast、slow相遇点的长度为y,相遇点到换入口的长度为z,fast在环内转了n圈才遇到slow;又因为fast的移动距离是slow的2倍,则可列: x+y+n*(y+z) = 2*(x+y) → x = (n-1)*(y+z)+z。

        当n = 1时,x = z,设置指针index_1 = head,index_2 = slow/fast(即相遇位置),易知index_1与index_2以相同的速度后移再相遇的位置即为环入口。

示意图:

代码如下:

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {ListNode slow = head;ListNode fast = head;while(fast != null && fast.next != null){//fast指针移速是slow指针的2倍fast = fast.next.next;slow = slow.next;//fast与slow相遇if(slow == fast){ListNode index_1 = head;ListNode index_2 = slow;//由思路中的数学分析进行同步后移操作while(index_1 != index_2){index_1 = index_1.next;index_2 = index_2.next;}return index_1;}}//fast最终指向null,链表无环return null;}
}

五、今日小结

        链表知识果然难呜呜呜,好在坚持写完了~ 24、19两题有待优化,142不熟练过几天需要回顾。最近休息不太好很影响效率和状态,明天出门运动、调整作息,加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434970.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL_list

一、有关list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。Ii…

JS之隐式转换与布尔判定

大家思考一下 [ ] [ ] ? 答案是空字符串 为什么呢? 当做加法运算的时候,发现左右两端存在非原始类型,也就是引用类型对象,就会对对象做隐式类型转换 如何执行的?或者说怎么查找的? 第一步&…

2. HarmonyOS 应用开发 DevEco Studio 准备-2

2. HarmonyOS 应用开发 DevEco Studio 准备-2 首选项设置 中文设置 主题 字体 插件安装和使用 保存时操作 编辑器 工程树管理 代码树管理 标记 字符串可视化编辑 参考文档 常用快捷键 编辑 查找或替换 编译与运行 调试 其他 预览 页面预览 自定义组件预览 预览…

深度学习-使用Labelimg数据标注

数据标注是计算机视觉和机器学习项目中至关重要的一步,而使用工具进行标注是提高效率的关键。本文介绍了LabelImg,一款常用的开源图像标注工具。用户可以在图像中方便而准确地标注目标区域,为训练机器学习模型提供高质量的标注数据。LabelImg…

HNU-编译原理-甘晴void学习感悟

前言 熬过煎熬的考试周、复习以及更加煎熬的等成绩,查到成绩的那一刻,心里还是挺开心的。 虽然我没有完全学懂这门课程,但我还是兢兢业业地通过了课程的考试,拿到了这门课程的认可。 记录一下自己对编译原理的学习感悟&#xf…

Android App开发-简单控件(4)——按钮触控和图像显示

3.4 按钮触控 本节介绍了按钮控件的常见用法,包括:如何设置大小写属性与点击属性,如何响应按钮的点击事件和长按事件,如何禁用按钮又该如何启用按钮,等等。 3.4.1 按钮控件Button 除了文本视图之外,按钮…

在autodl训练yolov8时卡在下载字体

1.问题 在autodl训练yolov8到这一步之后会卡住很久 2. 解决办法 Ctric中断后发现是下载Arial字体卡住了,这个字体需要从外网中下载 先手动从链接中下载https://ultralytics.com/assets/Arial.ttf ,然后上传到autodl。然后将这个文件移动到/root/.config/…

vusui css 使用,简单明了 适合后端人员 已解决

vusui-cssopen in new window 免除开发者繁复的手写 CSS 样式,让 WEB 前端开发更简单、灵活、便捷!如果喜欢就点个 ★Staropen in new window 吧。 移动设备优先: vusui-css 包含了贯穿于整个库的移动设备优先的样式。浏览器支持&#xff1a…

数据结构.单链表

1.单链表&#xff08;有头结点&#xff0c;无头节点&#xff09; 2.插入 不带头结点的处理起来会麻烦一些。 3.删除 4.查找 5.建立链表 6.头插法可以用来实现链表的逆置 代码&#xff1a; #include<iostream> using namespace std; const int N 10; typedef struct LNod…

【鸿蒙】大模型对话应用(二):对话界面设计与实现

Demo介绍 本demo对接阿里云和百度的大模型API&#xff0c;实现一个简单的对话应用。 DecEco Studio版本&#xff1a;DevEco Studio 3.1.1 Release HarmonyOS SDK版本&#xff1a;API9 关键点&#xff1a;ArkTS、ArkUI、UIAbility、网络http请求、列表布局、层叠布局 对话页…

【UE5】如何给人物骨骼绑定Control Rig用来制作动画(控制)

本篇文章暂时只教绑定人物手部的Control Rig&#xff0c;脚的Control Rig举一反三即可 1&#xff0c;右键-创建-控制绑定 2在控制绑定中-右键创建基本IK 3&#xff0c;填入上臂-下臂-手 4【手和下臂】右键-新建-Add Controls For Selected&#xff0c;&#xff08;或者新建-…

【C++】std::variant

上一篇文章讲到了 union&#xff0c;union union存在很多问题&#xff0c;因此C17设计了一个新的variant替代原来的union。 union的问题 无法知道当前使用的类型是什么。而且union无法自动调用底层数据成员的析构函数。 这些使得一般只对一些“基本类型”使用union&#xf…