Skip to content

链表题目解法总结

Img

虚拟头结点

为什么使用虚拟头结点

  • 可以让链表元素的增删代码更好写,思路更清晰

链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。

每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题。

对应题目的使用

  • 707.设计链表
    • 在这题如果不使用虚拟头结点,会发现代码量和思维量的巨量上升
    • 所以虚拟头结点是个日常思路,多用就好

双指针法

普通双指针的使用

  • 206.反转链表
    • 这道题就是用一个指针(A)遍历,另一个指针(B)保存另一个结点的地址,供 A 来访问。
  • 24.两两交换链表中的节点
    • 这道题用了两个指针(temp)来保存两个地址,一个指针(cur)遍历
    • 可想,双指针不是真的只有两个指针,你搞明白其保存地址和遍历地址的区别,你用三个、四个都是可以的。

快慢指针

介绍

  • 相比普通双指针,快慢指针多了一点:注重两指针间的距离
  • 由此,
    • 在单链表中,我们可以用快指针来控制慢指针的移动。比如快指针遍历到 下一个结点为 null 。还有其它的运用,如设定 if 来限制快慢指针的移动等。
    • 在环形链表中会有一些快慢指针相遇的情况

对应题目的使用

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

    • 这题我们先控制快慢指针的距离为 N,然后两指针同步向后遍历,用快指针指向空,来限制慢指针的移动。这样我们就找到我们想要的结点位置了
  • 02.07. 链表相交

    • 题目想要我们把链表尾部对齐,所以我们尝试让快指针先遍历一段距离(设为 N)到慢指针的位置
    • 快指针的 ‘快’ 体现在先遍历
    • 这个 N 就是两指针间的距离,是我们一开始求的 两个链表的长度差
  • 142.环形链表 II

    • 环形链表问题要确定是否有环,就像你跑步能不能套圈慢的人,如果你连圈都没有,怎么套圈。放到编程问题上,你的整一个跑得快的人(快指针),一个跑到慢的人(慢指针)
    • 这道题用二倍速的快指针求出一个数学关系,可谓是相当的妙。
  • 参考:代码随想录-链表总结篇