链表oj题

初学链表的练习题

    • 1.力扣203.[移除链表元素](https://leetcode-cn.com/problems/remove-linked-list-elements/description/)
    • 2.力扣206.[反转链表](https://leetcode-cn.com/problems/reverse-linked-list/submissions/)
    • 3.力扣876.[链表的中间节点](https://leetcode-cn.com/problems/middle-of-the-linked-list/description/)
    • 4.牛客:[链表中倒数第k个节点](https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking)
    • 5.力扣21.[合并两个有序链表](https://leetcode-cn.com/problems/merge-two-sorted-lists/)
    • 6.牛客.[链表分割](https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking)![在这里插入图片描述](https://img-blog.csdnimg.cn/554668aaa192467785a2b6386f748ed5.png)
    • 7.牛客.[链表的回文结构](https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking)
    • 8.力扣160.[相交链表](https://leetcode-cn.com/problems/intersection-of-two-linked-lists/submissions/)
    • 9.力扣141.[环形链表](https://leetcode-cn.com/problems/linked-list-cycle/submissions/)
    • 10.力扣142.[环形链表Ⅱ](https://leetcode-cn.com/problems/linked-list-cycle-ii/)
    • 11.力扣138.[复制带随机指针的链表](https://leetcode-cn.com/problems/copy-list-with-random-pointer/)
    • 12.力扣147.[对链表进行插入排序](https://leetcode-cn.com/problems/insertion-sort-list/)
    • 13.牛客.[删除链表中重复的节点](https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId=13&&tqId=11209&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking)

1.力扣203.移除链表元素

链表oj题_第1张图片

思路:迭代,创建一个哨兵位,创建三个指针,第一个指针是cur,用来遍历的,第二个指针是next,他是cur的下一个节点,第三个是prev,他是用来和删除掉cur的后面的节点链接。

链表oj题_第2张图片

2.力扣206.反转链表

链表oj题_第3张图片

思路:创建一个头节点,然后依次调转方向

链表oj题_第4张图片

3.力扣876.链表的中间节点

链表oj题_第5张图片

思路:可以用快慢指针,慢指针一次走一步,快指针一次走两步,当快指针走到尾时,慢指针刚好到中间。

链表oj题_第6张图片

4.牛客:链表中倒数第k个节点

链表oj题_第7张图片

思路:也是利用快慢双指针,让fast先走k步,然后快慢同时走,fast到尾,slow就是倒数第k个节点

链表oj题_第8张图片

5.力扣21.合并两个有序链表

在这里插入图片描述

链表oj题_第9张图片

思路:创建一个头节点,然后比较两个链表,小的放里面,以此类推。

链表oj题_第10张图片

6.牛客.链表分割链表oj题_第11张图片

思路:把链表分割成两段,一段存放小于x的,另外一段存放大于等于的,最后在链接,不要忘了合并的链表结尾的下一个节点要置空。

链表oj题_第12张图片

7.牛客.链表的回文结构

链表oj题_第13张图片

思路:先找到中间节点,然后把后半段倒置,在比较这两个部分

链表oj题_第14张图片

8.力扣160.相交链表

链表oj题_第15张图片

思路:分别计算A、B的长度,然后让长的先走它俩的差值,再一起走,相等就是相交的那个节点。

链表oj题_第16张图片

9.力扣141.环形链表

链表oj题_第17张图片

思路:可以用快慢指针,快指针一次走两步,慢指针一次走一步,如果有环,当他俩都进入环中时,走一步,他俩的差距缩小一步,最终一定会相遇。

链表oj题_第18张图片

10.力扣142.环形链表Ⅱ

链表oj题_第19张图片

思路:用快慢指针,快指针一次走两步,慢指针一次走一步
假设:链表头到环的入口的距离为a,快慢指针相遇在环中的b位置,环中剩余的为c
当慢指针进入环中,快指针不知道走了多少圈了,相遇的时候快指针走了n(b+c)+b+a


为什么慢指针没走完一圈就会被快指针追上呢?
当慢指针进入到环中时,此时快指针不知道在环中的哪个位置,设为x
他俩的距离就是b+c-x,快指针追上慢指针需要b+c-x步,x是>=0的
所以不管在什么地方相遇,慢指针都没走完一圈

所以就有了这个公式:a+n(b+c)+b=2(a+b)		2(a+b):快指针是慢指针的两倍

推出来得a=nc+nb-b => a=c+(n-1)(b+c)
也就是,链表头到入环点的距离等于相遇点到入环点的距离加上快指针走了(n-1)(b+c)圈数

所以先找到快慢指针的交点,然后在让他俩同步走,一次一步,等到他俩相等的时候就是入环点

链表oj题_第20张图片

11.力扣138.复制带随机指针的链表

链表oj题_第21张图片

思路:可以在原链表中每个节点后面链接一个复制的单个节点,先复制值,然后处理random指针,接着在剪切出来

链表oj题_第22张图片

12.力扣147.对链表进行插入排序

链表oj题_第23张图片

思路:先取一个数据做为假设排好序的序列,然后比较剩下链表的值和排好序列的值
有两种情况:
1.剩下的值小于排好的序列,直接头插
2.剩下的值大于排好的序列,插入到节点中间

链表oj题_第24张图片

13.牛客.删除链表中重复的节点

链表oj题_第25张图片

思路:运用三指针,题目可知,这个链表是排序的
NewNode指针用来链接
cur是链表的第一个节点
next是cur的下一个

用next来控制循环
有两点要注意:
1.因为链表是排序的,所以最后剩下一个节点的时候不需要在判断了
2.特殊情况,链表元素全是一样的,那么需要判断NewNode是否为空

链表oj题_第26张图片

你可能感兴趣的:(数据结构,链表,数据结构)