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

news/2024/10/5 8:56:04/文章来源:https://www.cnblogs.com/frontpen/p/18286959

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

题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/
题目难度:中等
文章讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#算法公开课
视频讲解: https://www.bilibili.com/video/BV1YT411g7br
题目状态:有思路,但细节缺乏考虑

个人思路:

  1. 首先判断head和其下一节点是否是nullptr,若是,就直接返回head
  2. 创建两个指针firstsecond,再创建一个辅助指针tmp用于保存second的下一节点;
  3. 在循环中利用tmp指针,将firstsecond交换;
  4. 返回head

出现的问题:

  1. 循环的结束条件比较难以设置;
  2. 当返回head时,只是从交换后的链表的第二节点返回,需要再使用一个节点用来指向第一节点。

修改思路:

添加一个哨兵指针dummy指向head,并且改变辅助指针tmp的指向,指向first的前一节点。

最终代码:

/*** 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) {if(head == nullptr || head->next == nullptr) return head;ListNode dummy(0);dummy.next = head;ListNode *prev = &dummy;while(prev->next != nullptr && prev->next->next != nullptr) {ListNode *first = prev->next;ListNode *second = first->next;prev->next = second;first->next = second->next;second->next = first;prev = first;}return dummy.next;}
};

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

题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
题目难度:中等
文章讲解:https://programmercarl.com/0019.删除链表的倒数第N个节点.html
视频讲解: https://www.bilibili.com/video/BV1vW4y1U7Gf
题目状态:通过,有思路,且细节把控方面比上题强

个人思路:

使用快慢指针进行遍历。

  1. 不管三七二十一,先创建一个哨兵指针dummy
  2. 初始化两个快慢指针:slowfast,指向dummy
  3. 先将fast向后遍历n步,之后fastslow指针一起向后遍历,直到fast->next == nullptr
  4. 当遍历完成后,slow->next就是我们要删除的节点,创建一个辅助指针tmp指向slow->next,将slow->next = slow->next->next,然后删除tmp
  5. 返回dummy.next

最终代码:

/*** 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 dummy(0);dummy.next = head;ListNode *fast = &dummy;ListNode *slow = &dummy;for(int i = 0; i < n; ++i) {fast = fast->next;}while(fast->next != nullptr) {fast = fast->next;slow = slow->next;}ListNode *tmp = slow->next;slow->next = slow->next->next;delete tmp;return dummy.next;}
};

面试题 02.07.链表相交

题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/
题目难度:简单
文章讲解:https://programmercarl.com/面试题02.07.链表相交.html
题目状态:无法理解题目,看文章讲解勉强通过

纱布题,根本不说人话,看了文章讲解才看懂讲的什么意思,交点不是数值相同,而是指针相同

代码展示:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *curA = headA;ListNode *curB = headB;int lenA = 0, lenB = 0;while(curA != nullptr) {lenA++;curA = curA->next;}while(curB != nullptr) {lenB++;curB = curB->next;}curA = headA;curB = headB;if(lenB > lenA) {swap(lenA, lenB);swap(curA, curB);}int gap = lenA - lenB;while(gap--) curA = curA->next;while(curA != nullptr) {if(curA == curB) return curA;curA = curA->next;curB = curB->next;}return nullptr;}
};

142. 环形链表 II

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/
题目难度:中等
文章讲解:https://programmercarl.com/0142.环形链表II.html
视频讲解: https://www.bilibili.com/video/BV1if4y1d7ob
题目状态:之前在《剑指Offer》中看到过这个题,还记得大致思路,但是实际编写代码的时候还是出现了一些问题,最终通过

思路:
总体上是使用两次快慢指针解决

  1. 首先判断其链表是不是环形的,采用快慢指针解决,当慢指针与快指针相遇时,表明该链表是环形的,返回相遇的节点;
  2. 利用相遇的节点继续向下遍历,当节点再一次与自己相等时,表明该节点围绕了环形一圈,由此获得环形的大小;
  3. 通过环形的大小,再次利用快慢指针从头节点遍历,当快指针和慢指针相等时,获得了环形链表的入口节点。

⚠️注意:
这两次快慢指针用法不同。

  1. 第一次使用的快慢指针中,快指针每次走两步,慢指针每次走一步;
  2. 第二次使用的快慢指针中,快指针先走一段,之后快慢指针按照相同的速度向后遍历。

具体代码:

/*** 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) {ListNode *CycleNode = InCycle(head);if(CycleNode == nullptr) return nullptr;int CycleNum = 1;for(ListNode *n = CycleNode; n->next != CycleNode; n = n->next) {CycleNum++;}ListNode *fast = head;for(int i = 0; i < CycleNum; ++i) fast = fast->next;ListNode *slow = head;while(fast != slow) {fast = fast->next;slow = slow->next;}return slow;}ListNode *InCycle(ListNode *head) {if(head == nullptr || head->next == nullptr) return nullptr;ListNode *slow = head->next;ListNode *fast = slow->next;while(slow != nullptr && fast != nullptr && fast->next != nullptr) {if(slow == fast) return slow;slow = slow->next;fast = fast->next->next;}return nullptr;}
};

链表总结(来自代码随想录):

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

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

相关文章

【0基础学爬虫】爬虫框架之 feapder 的使用

前言 大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫。 学习爬虫的过程中,一…

PTA题目集7-8的总结

PTA题目集7-8的总结 1.前言: 2.设计与分析: 3.踩坑心得: 4.改进意见: 5.总结 1.前言:PTA题目集7新增了互斥开关,窗帘,多并联电路和多串联电路。由于之前的输入信息中设备的引脚没有作用,所以我的正则表达式只用来提取设备的名字。而互斥开关有三个引脚,不同引脚的电压…

pycharm 动态绘图

_tkinter.TclError: Cant find a usable init.tcl in the following directories:解决办法: 1 打开报错地址所在文件 D:/Program Files/METACOMP/mlib/tcltk8/lib/tcl8.4/init.tcl: version conflict for package "Tcl": have 8.6.9, need exactly 8.4 2 修改init.t…

从零开始教你写一个MLIR Pass

笔者在去年写了一篇LLVM Pass的教程,现在从事MLIR的开发近1年了,写点教程回馈下社区。 MLIR(Multi-Level Intermediate Representation,多层中间表示)是LLVM之父(博士期间开发的LLVM)的Chris Lattner带领团队开发的编译器基础设施,其增强了 LLVM IR表达能力,而且其是关注P…

idm下载

获得百度网盘直链下载链接调用idm谷歌插件获得城盘直链下载链接调用idm谷歌插件 https://ctfile.qinlili.bid/当你的才华配不上你的野心,努力的时候到了!

Arthas进阶-笔记

《Arthas进阶》 学习目标类和类加载器相关的命令 monitor/watch/trace/stack等核心命令的使用 火焰图的生成 Arthas实战案例dump 作用 将已加载类的字节码文件保存到特定目录:logs/arthas/classdump/ 参数数名称 参数说明class-pattern 类名表达式匹配[c:] 类所属 ClassLoader…

域名、备案和HTTPS

有了域名后,可以方便其他人记住并访问12.域名、备案和HTTPS 有了域名后,可以方便其他人记住并访问,历史上不乏大企业花大价钱购买域名的:京东域名换成 JD.com,并且说是为了防止百度吸引流量,为什么? 唯品会买下域名 VIP.COM 或花费千万‍ 域名提供商 如果想要域名,得去…

陪玩app源码,加密算法中密钥生成和读取一览

陪玩app源码,加密算法中密钥生成和读取一览密钥生成与读取密码学随机数密码学随机数算法在安全场景中使用广泛,如:生成对称密钥、盐、iv等,因此相比普通的随机数算法(如线性同余),它需要更高强度的不可预测性,在Java中,使用SecureRandom来生成更安全的随机数,如下:pub…

陪玩小程序源码,不容错过的加密算法整理清单

陪玩小程序源码,不容错过的加密算法整理清单在开发陪玩小程序源码时,可采用的加密算法类型包含:对称加密对称加密算法,使用Cipher类即可,以广泛使用的AES为例,如下:public byte[] encrypt(byte[] data, Key key) {try {Cipher cipher = Cipher.getInstance("AES/CB…

【QT】工程库引用

创建多工程项目创建子项目UI窗体项目创建库工程项目引用库工程添加日志输出类5.1 需要添加特殊配置,否则编译会报错5.2 正确添加配置5.3 日志正常输出5.4 如果缺少5.1步骤,则报如下错误5.5 如果添加了5.1步骤,还是报The process was ended forcefully 找到项目文件,把debug…

陪玩系统源码,为守护系统安全增添更多助力

陪玩系统源码,为守护系统安全增添更多助力在开发陪玩系统源码时,可以通过加密、解密算法来提升系统的安全性,比较常见的加密、解密算法类型有:1、对称加密:速度快,可逆,常见DES,AES等2、非对称加密:速度慢,可逆,常见RSA等3、签名算法:唯一,不可逆,常见MD5,SHA,…

pycharm创建临时文件scatch file

JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 有时您可能需要创建临时注释或在项目上下文之外起草一些代码。为此,您可以使用临时文件和临时缓冲…