| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 代码随想录刷题|LeetCode 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 160. 链表相交 142.环形链表II -> 正文阅读 |
|
[数据结构与算法]代码随想录刷题|LeetCode 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 160. 链表相交 142.环形链表II |
目录 24. 两两交换链表中的节点题目链接:?力扣 思路? ? ? ? 我的一开始的失误点:定义三个指针移动元素,外加一个临时指针保存元素,导致后面循环的条件一直整不对,最终一直报空指针异常的错误 ? ? ? ? 正确的思路: ? ? ? ??首先:节点应该怎么交换(下图红色箭头代表需要交换的节点),节点两两交换的时候,我们应该知道这两个节点之前的节点和之后的节点的,要不然节点就连不上了。比如,现在要交换1、2节点,我们要站在dummyhead的位置上进行交换(定义指针从虚拟头节点开始),而且要保存3节点,交换后为demmyhead-->2-->1-->3,这样才算完成一次交换,写交换节点过程的代码,按照交换后的顺序写就可以 ? ? ? ? dummy.next = 2 ? ? ? ? 2.next = 1 ? ? ? ? 1.next =3? ? ? ? ? ? ? ?其次:交换的终止条件在哪里,这是这个题目的一个难点,很容易会想不明白,cur是我们定义的节点,那就看一下指针在什么情况下就不在对节点进行交换了 ? ? ? ? ????????从下图中我们可以看出(下图红色箭头代表cur),如果链表节点数为奇数,那么在cur.next.next == null 的时候,就不用再进行交换了。如果链表的节点数为偶数,那么再cur.next == null 的时候,就不在进行交换了 ? ? ? ????????? 所以,能继续交换下去的条件是 cur.next != null && cur.next.next != null ? ? ? ? ????????cur是虚拟头节点,不可能为空,所以上面的判断条件是会判断链表中没有节点和链表中只有一个节点的情况 ? ? ? ? ?最后:为了交换节点,我们还需要定义相应的临时节点,如下图: ? ? ? ? ? ? ? ? 第一次交换:cur指向节点dummyhead,交换条件成立。进行交换 ? ? ? ? ? ? ? ? 第二次交换:cur指向节点2,交换条件成立。进行交换 ? ? ? ? ? ? ? ? 第三次交换:cur指向节点4,交换条件不成立,终止循环 两两交换链表中的节点
19. 删除链表的倒数第N个节点题目链接:力扣 思路? ? ? ? 这道题主要要解决两个问题:1、怎么找到倒数第n个节点? ? 2、怎么删除对应的节点 ? ? ? ? 怎么找到倒数第n个节点:我们可以定义两个指针,让第一个指针先走n步,第一个指针走到n节点的时候,开始同时移动两个节点。当先走的节点走到链表末尾null的时候。此时后走的节点就会在倒数第n个节点上,如下图:?? ?????????怎么删除对应的节点:按照上图的方法,我们可以找到倒数第n个对应的节点,但是当slow指向这个节点的时候,没有办法对这个节点进行删除,因为删除这个节点,我们需要知道上一个节点,所以我们需要改变一下终止循环的条件,让fast指针移动到最后一个节点就可以,这样slow就指向3节点,可以对4节点进行删除操作,如下图 删除链表的倒数第N个节点? ? ? ? 第一步:创建虚拟头节点,以便将头节点和其他节点统一化;创建双指针,便于对节点进行删除 ? ? ? ? 第二步:首先移动fast指针 ? ? ? ? 第三步:一起移动slow指针和fast指针 ? ? ? ? 第四步:删除节点
160. 链表相交题目链接:力扣 思路? ? ? ? 其实这个题目更像是模拟,只要想到要将两个链表的末尾对齐,这个题目就差不多了 ? ? ? ? 然后再需要注意的问题,就是不一定就是A链表就更长,在进行下面找链表节点的过程中我们一定要知道哪个节点是长的,哪个节点是短的,为了同意,可以将curA指向更长的链表,有利于后面的处理 ? ? ? ? 这个题目不需要虚拟头节点,定义了也是多余的,因为这里的头节点只有可能进行比较,不进行删除 链表相交? ? ? ? 第一步:计算两个链表的长度? ? ? ? ? 第二步:找出长度较长的链表 ? ? ? ? 第三步:对齐链表(末尾对齐) ? ? ? ? 第四步:遍历找相交的节点
142. 环形链表II题目链接:力扣 思路? ? ? ? 使用快慢指针的方式: ? ? ? ? 2、快慢指针分别走多块? ? ? ? ? 判断链表是否有环: ? ? ? ? 找到环的入口:? ? ? ? ?? ? ? ? ? ? ? ? ? x为头节点到环的入口处节点的位置的长度 ? ? ? ? ? ? ? ? 假设fast和slow相遇了 ? ? ? ? ? ? ? ? 按照两个指针移动的速度,有等式成立: ? ? ? ? ? ? ? ? 以上得到的等式非常重要,意味着? x = z? , y + z 只是快指针在环中的转圈 ? ? ? ? ? ? ? ? 注:快指针肯定在环里面至少走了一圈 ? ? ? ? ? ? ? ? 为什么慢节点只在环里面走了一圈就被追上了,没有在环里面转圈圈? ? ? ? ? ? ? 环形链表II? ? ? ? 第一步:创建快慢指针 ? ? ? ? 第二步:移动快慢指针。找出相遇点 ? ? ? ? 第三步:定义两个指针,分别从相遇点和头节点出发 ? ? ? ? 第四步:相遇处就是入口书处
——————————————————————————————————————————— 参考: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:15:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |