链表LinkedList

[TOC]

1、快慢指针

在数组章节我们学习的双指针技巧,通常是两个指针从前后一起遍历,向中间逼近;或者读写指针维护不同的数据元素;而在链表的运用中,由于单向链表只能单向遍历,通过调整两个指针的遍历速度完成某种特定任务,因此也称为”快慢指针“技巧。

快慢指针有几个常见的用法:

用法1:找单链表的中点

快指针走2步,慢指针走1步,当快指针走完的时候,慢指针刚好在一半的位置。

这类题目有:

  • 143—重排链表,快慢的同时反转一部分链表

  • 876—链表的中间节点

  • 234—回文链表,快慢的同时反转一部分链表

用法2:判断是否相交,或者是否有环**

如果存在相交或者有环,那么两个指针一定会走到一起。

这类题目有 第 141 题,第 142 题,第 160 题。

  • 141—判断链表是否有环

  • 142—判断链表是否有环,如果有,返回环入口

  • 160—相交链表,求两个链表的交点

用法3:寻找倒数第 N 个节点

快指针先行 N 步,慢指针再从头节点开始走,那么当快指针走到结束的时候,慢指针刚好走到第 N 个节点。

这类题目有:

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

用法4:快慢指针形成一个窗口

对于要求链表中节点连续,并满足一定条件的题目,可使用 start/end 指针形成的窗口进行判断。

这类题目有:

  • 82—删除链表中的重复元素2

  • 817—链表的组件,类似求最长连续子序列和

2、哑结点

哑结点,也称为哨兵结点。常见的场景有:

用法1:保存结果集

遍历原链表,将最终的结果保存在哑结点起始的链表中。

这类题目有:

  • 002—两数相加(开辟新空间保存结果)

  • 021—合并两个有序链表(不需要开辟空间,直接将结果链接到哑结点上)

最后更新于