LeetCode、牛客刷题篇——单链表

目录

移除链表元素

反转链表

链表的中间节点

链表中倒数第k个节点

合并两个有序链表

链表分割

链表的回文

相交链表 

环形链表

环形链表 ||

复制带随机指针的链表


移除链表元素

题目链接:移除链表元素icon-default.png?t=M4ADhttps://leetcode.cn/problems/remove-linked-list-elements/description/

先来看一下第一个题

LeetCode、牛客刷题篇——单链表_第1张图片

画图更醒目,也叫画图分析代码逻辑,走读代码分析

LeetCode、牛客刷题篇——单链表_第2张图片

LeetCode、牛客刷题篇——单链表_第3张图片

LeetCode、牛客刷题篇——单链表_第4张图片

把图文转换为代码如下,但还是有测试用例通不过,就拿测试用例思考一下

LeetCode、牛客刷题篇——单链表_第5张图片

LeetCode、牛客刷题篇——单链表_第6张图片

LeetCode、牛客刷题篇——单链表_第7张图片

LeetCode、牛客刷题篇——单链表_第8张图片

再来思考一下,前一篇中的单链表博客中,这种插入删除时传入的是二级指针,但这里使用的是一级指针,因为上一篇的函数为void,没有返回,想要改变一级指针就要传入一级指针的地址,但这个函数返回类型为结构体指针,最后return新的头节点就可以改变原来的链表。

再讲解另一种解法

LeetCode、牛客刷题篇——单链表_第9张图片

LeetCode、牛客刷题篇——单链表_第10张图片

LeetCode、牛客刷题篇——单链表_第11张图片 可以看到还是有测试用例报错,简单想一下,如果尾节点也是要删除的数据,此时tail就是尾节点,需要把tail->next赋为NULL,但是再想一下,如果一开始就是一个空链表呢,tail是NULL就不能赋值了,所以最后也要判断一下,如果tail为NULL就证明是个空链表就不需要改变tail->next,如果不是就置为NULL。

LeetCode、牛客刷题篇——单链表_第12张图片

LeetCode、牛客刷题篇——单链表_第13张图片

LeetCode、牛客刷题篇——单链表_第14张图片LeetCode、牛客刷题篇——单链表_第15张图片

那么到这里就讲完了这个题。


反转链表

题目链接:

反转链表icon-default.png?t=M4ADhttps://leetcode.cn/problems/reverse-linked-list/description/

LeetCode、牛客刷题篇——单链表_第16张图片

LeetCode、牛客刷题篇——单链表_第17张图片

LeetCode、牛客刷题篇——单链表_第18张图片LeetCode、牛客刷题篇——单链表_第19张图片

另一种方法

LeetCode、牛客刷题篇——单链表_第20张图片

LeetCode、牛客刷题篇——单链表_第21张图片LeetCode、牛客刷题篇——单链表_第22张图片

LeetCode、牛客刷题篇——单链表_第23张图片


链表的中间节点

题目链接:

链表的中间节点icon-default.png?t=M4ADhttps://leetcode.cn/problems/middle-of-the-linked-list/description/

LeetCode、牛客刷题篇——单链表_第24张图片

 LeetCode、牛客刷题篇——单链表_第25张图片

 LeetCode、牛客刷题篇——单链表_第26张图片

LeetCode、牛客刷题篇——单链表_第27张图片


链表中倒数第k个节点

题目链接:

链表中倒数第k个节点icon-default.png?t=M4ADhttps://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

LeetCode、牛客刷题篇——单链表_第28张图片

LeetCode、牛客刷题篇——单链表_第29张图片

LeetCode、牛客刷题篇——单链表_第30张图片

虽然我们的思路没有问题,但最后还是报错了,那就来思考一下,题目里也没有说k一定小于等于链表个数的啊,那如果fast先走到NULL,比如链表有3个节点,想找到倒数第5个那肯定是不可能的啊,所以直接返会NULL就好了。


合并两个有序链表

题目链接:

合并两个有序链表icon-default.png?t=M4ADhttps://leetcode.cn/problems/merge-two-sorted-lists/description/

LeetCode、牛客刷题篇——单链表_第31张图片

LeetCode、牛客刷题篇——单链表_第32张图片LeetCode、牛客刷题篇——单链表_第33张图片

LeetCode、牛客刷题篇——单链表_第34张图片

LeetCode、牛客刷题篇——单链表_第35张图片

LeetCode、牛客刷题篇——单链表_第36张图片

又看到执行出错了,有特殊用例,如果一开始一个是空链表,就不会进入循环,直接来到下面,if语句判断的时候list1为空,不会进入这个语句,list2不为空,tail进行操作,但这时候太tail是NULL就会报错,就可以单独处理一下空链表的情况。

LeetCode、牛客刷题篇——单链表_第37张图片

如果list1为空,就返回list2,如果list2为NULL,就返回list1,如果两个都是空链表,也没有问题,随便返回一个就可以。 

上面这种是不带哨兵位的,那下面就写一个带哨兵位的。

LeetCode、牛客刷题篇——单链表_第38张图片

malloc申请一块当作哨兵位,有了哨兵位就不用判断一开始是不是NULL了,最后再free掉哨兵位就可以了。 


链表分割

题目链表:

链表分割icon-default.png?t=M4ADhttps://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

LeetCode、牛客刷题篇——单链表_第39张图片

题目解释的不是很清楚,那就画图来理解一下,假如x=7,就是如图这样变化的,不改变数据的顺序,也就是说头插不行,尾插也会很麻烦,那该怎样办呢。

LeetCode、牛客刷题篇——单链表_第40张图片

LeetCode、牛客刷题篇——单链表_第41张图片

LeetCode、牛客刷题篇——单链表_第42张图片

 虽然这里标注的是使用C++,但是C++兼容C,所以这里用C写是没有问题的。LeetCode、牛客刷题篇——单链表_第43张图片

LeetCode、牛客刷题篇——单链表_第44张图片

 可以是我们分析的没有问题,可是这里为什么会报错呢。

LeetCode、牛客刷题篇——单链表_第45张图片

从这到就可以看到如果不带哨兵位,尾插时还需要处理NULL的情况,这也就是哨兵位的优势。


链表的回文

题目链接:

链表的回文icon-default.png?t=M4ADhttps://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking

LeetCode、牛客刷题篇——单链表_第46张图片

LeetCode、牛客刷题篇——单链表_第47张图片

LeetCode、牛客刷题篇——单链表_第48张图片


相交链表 

题目链接:

相交链表icon-default.png?t=M4ADhttps://leetcode.cn/problems/intersection-of-two-linked-lists/description/

LeetCode、牛客刷题篇——单链表_第49张图片

LeetCode、牛客刷题篇——单链表_第50张图片

LeetCode、牛客刷题篇——单链表_第51张图片 第一种我们就不介绍了,我们来介绍另一种简单的思路

LeetCode、牛客刷题篇——单链表_第52张图片

LeetCode、牛客刷题篇——单链表_第53张图片


环形链表

题目链接:

环形链表icon-default.png?t=M4ADhttps://leetcode.cn/problems/linked-list-cycle/description/

LeetCode、牛客刷题篇——单链表_第54张图片

LeetCode、牛客刷题篇——单链表_第55张图片

LeetCode、牛客刷题篇——单链表_第56张图片

环形链表 ||

题目链表:

环形链表||icon-default.png?t=M4ADhttps://leetcode.cn/problems/linked-list-cycle-ii/description/

LeetCode、牛客刷题篇——单链表_第57张图片

 在讲解这道题之前,我们先来证明一下为什么可以追上

LeetCode、牛客刷题篇——单链表_第58张图片

LeetCode、牛客刷题篇——单链表_第59张图片

LeetCode、牛客刷题篇——单链表_第60张图片LeetCode、牛客刷题篇——单链表_第61张图片

走三步只是个问题的延申,为了拓展一下我们的思路,与这道题关联不大,接下来就来看一下这道题的思路,还是讨论快指针走两步的情况。

LeetCode、牛客刷题篇——单链表_第62张图片

LeetCode、牛客刷题篇——单链表_第63张图片

 LeetCode、牛客刷题篇——单链表_第64张图片

这里还有一个新思路

LeetCode、牛客刷题篇——单链表_第65张图片

LeetCode、牛客刷题篇——单链表_第66张图片


复制带随机指针的链表

题目链接:

复制带随机指针的链表icon-default.png?t=M4ADhttps://leetcode.cn/problems/copy-list-with-random-pointer/description/

LeetCode、牛客刷题篇——单链表_第67张图片

接下来我就来看一下这个复杂链表该如何去解,其实看这个题干还是很费劲的,我们解释一下,再来看这个示例。

LeetCode、牛客刷题篇——单链表_第68张图片

LeetCode、牛客刷题篇——单链表_第69张图片LeetCode、牛客刷题篇——单链表_第70张图片

LeetCode、牛客刷题篇——单链表_第71张图片 这个尾插就没有使用哨兵位,那尾插就需要判断第一个节点是不是NULL。

       那么这一篇文章就介绍到这里了,可以看到这些题都是单链表的,因为可以对于单链表的缺陷而出题,像双向带头循环链表的结构太完美了,出题感觉意义不大。写完了这一篇之后感觉自己对链表有了更深的理解,所以我们还是得努力,努力过后的那种充实的感觉让我回味无穷。

你可能感兴趣的:(leetcode,链表)