链表经典题目学习笔记

链表经典题目学习笔记

链表操作类

  1. 删除节点:对于这类题目可以将数组中的双指针思想对应搬过来,由于是将特定的节点进行删除,可以反过来思考,新建一个链表,只取非特定的节点,对应的特征是指明特定的节点。

    附上例题:

    [“删除链表中等于给定值 val 的所有结点”](https://leetcode-cn.com/problems/remove-linked-list-elements/description/

    对应解法:双指针筛选法

  2. 新建链表:总的来说这类题目是根据原链表进行一个调整,我们可以根据要求利用双指针进行筛选,将合适的节点比较一下,放入新建的节点,即利用双指针筛选法。

    附上例题:

    将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有结点组成

    对应解法:双指针比较法

    特征对应:有序+新建列表

    将所有小于x的结点排在其余结点之前

    对应解法:双指针比较法+列表合并

    特征对应:新建链表+比较大小

  3. 链表反转:朴实无华的掉头。

    附上例题:

    反转链表

    对应解法:链表反转

  4. 完全拷贝:这类问题的难点在于位置的多变性,如果能够确定位置,那么思路便清晰了。我们能够直到原链表的位置,那么我们就可以利用同样可以确定的相对位置去找到多变的位置。

    附上例题:

    给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中的任何结点或空结点

    对应解法:相对复制法

    特征对应:可知的定位点和相对距离

链表判断类

  1. 对称结构:在数组中,我们可以利用双指针从两头进行遍历,进行判断,可是链表是单向的,只有这一个条件是缺失的,那么我们把这个条件转化成可利用的条件,利用链表反转法将一半进行反转便可以进行判断了。

    附上例题:

    链表回文

    对应解法:反转法+双指针相行法

    特征对应:链表的单向性+判断

  2. 环形链表:要判断一个链表是否是环形链表,可以想到进行标记,如果一个节点重复出现了两次,那么也就意味着这是环形链表,但是如何判断一个节点重复出现两次,可以利用双指针进行判断,两个指针的标记重复,也就意味着在同一时间内达到一个节点,由于环的特性可以联想到跑圈,这就转换为追及问题了,那么就利用快慢指针进行标记。

    附上例题:

    给定一个链表,判断链表中是否有环

    对应解法:快慢指针法

    特征对应:复位性+双标记

寻找节点类

  1. 相对第K个节点类:这一类的题目重点在于相对位置的判断,找到了相对位置,那么我们就可以利用相对的思想,对节点的实际位置进行定位。

    附上例题:

    给定一个带有头结点 head 的非空单链表,返回链表的中间结点

    输出该链表中倒数第k个结点

    对应解法:快慢指针法

    特征对应:已知相对位置和停止点

  2. 相交链表:对于相交的链表,可以自然想到两个指针从两边开始出发,触碰到一起时就代表到达了相交的节点,此时返回即可,但问题在于这是极端的情况,两边的长度相等,实际情况下两边的长度不太可能相等,因此两个指针存在距离差,那么让距离差消失就好了,可是我们并不知道距离差是多少,因此还要遍历链表并计数,看两个指针走完的距离差。

    附上例题:

    输入两个链表,找出它们的第一个公共结点

    对应解法:双指针齐同法

    特征对应:多个链表指向同一链表+双标记+相对位置可求

  3. 环形链表:对于环形链表,第一步就是判断,这在之前已经叙述过。同样是找第一个共节点,我们可以看到,有多个链表指向同一个节点,并且可以想到用双指针进行标记,这样的特征满足了之前找相交链表的部分特征,可是相对位置不可求,因为这是一个环形链表,无法停下,不可通过遍历获取长度,那么要解决的就是停下的问题,因此可以破坏这个环形链表,让其变成一个相交链表。

    附上例题:

    给定一个链表,返回链表开始入环的第一个结点

    对应解法:快慢指针法+双指针齐同法

    特征对应:复位性+多个链表指向同一链表+双标记+相对位置可求


    对于此题,还有另一种更为完整的步骤,这要从头开始:

    对于快慢指针,有距离关系:

2 S s = S f S f = L + x C + N S s = L + N 2S_s=S_f \\ S_f = L+xC+N\\ S_s=L+N 2Ss=SfSf=L+xC+NSs=L+N

S分别代表快慢指针的距离,L是非环链表的长度,C是环的长度,N代表慢指针在环上行走的距离。将其代入可得
2 ( L + N ) = L + x C + N L = x C − N 2(L+N)=L+xC+N\\ L=xC-N 2(L+N)=L+xC+NL=xCN
如果把这两边视为要走的距离,那么在头节点和fast和slow相交的节点分别置下新的指针,那么这两个新的指针在相遇的时候所需要走的距离是一样的,那么接下来的步骤也就呼之欲出了。但如何想出来要这么做呢?这其实和上面的解法是一样的,关键在于求相对位置这一过程,有了求相对位置这一意识,也就有了上面的推导,那么,是不是所有的找节点问题都可以利用相对位置这一意识呢?

  • 28
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值