单链表 题型

概要

简述

  • 如果遇到多个单链表,那么大概率是需要使用双指针,要么就是优先级队列
  • 链表遍历框架,兼具线性和非线性遍历结构
    • 可以用循环遍历,也可以递归遍历
    • 所以可以思考一下,除了遍历还能用递归解题

题型总结

  • 反转链表题型
  • 判断是否回文链表
  • 合并两个有序链表
  • 合并k个有序链表
  • 寻找单链表的倒数第k个节点
  • 寻找单链表的中点
  • 判断单链表是否包含环并找出环起点
  • 判断两个单链表是否相交并找出交点

反转链表

反转一个单链表

  • 反转链表过程中需要存储变量,代表两个链表,一个是已经反转的链表,一个待翻转的链表
  • 记得对于开始时,已经反转的链表是null,还有一个带翻转的链表

对一个单链表位置m到位置n进行反转

  • 保存m之前的节点
  • 翻转m到n的链表
  • 拼接起来

分组翻转

  • 因为要求如果不满足分组个数,则不进行翻转,所以就必须先分组再翻转
  • 递归和循环都能做

判断是否回文链表

回文链表特性

  • 回文串/回文链表,就是正者念反着念一模一样
    • 利用这个特性,可以反转回文串/回文链表,然后进行同时对两个串/链表遍历,逐一比对
  • 具备对称的属性
    • 利用这个特性,可以从中间向两边进行逐一比对
    • 对于单向链表,因为无法逆向遍历,那么可以把其中一半翻转完再进行对比

做法

  • 如果基于正反念一样的特性,那么可以使用递归然后对链表进行逐一比对
  • 如果基于对称的特性,那么可以找到中点,然后翻转后半部分再进行对比

合并两个有序链表

思路

  • 双指针遍历,取出小的节点组成链表

细节

  • 虚构一个头结点(dummyHead)

合并k个有序链表

思路

  • 在多个链表头取最小的节点组成链表
  • 关键是怎么比对最小的节点
    • 利用链表节点进行排序
      • 跳表
    • 利用数组结构进行排序
      • 最小堆(优先队列)
    • 循环所有节点进行比较

寻找单链表的倒数第k个节点

思路

  • 双指针遍历,第一个指针先走k步

寻找单链表的中点

思路

  • 快慢指针,一个指针走一步,一个指针走两步

判断单链表是否包含环并找出环起点

是否包含环的思路

  • 快慢指针遍历
    • 如果不含环,那么不会遇到null
    • 如果指针节点一样,说明两个指针在环里面相遇了

找环起点

  • 快慢指针相遇后,两个指针同步移动速度,一个从起点出发,遇到就是环起点

判断两个单链表是否相交并找出交点

思路

  • 如果链表相交,那么两链表长度为a+c,b+c
    • 那么,可以双指针遍历,当遍历完自己的链表再遍历对方的链表
    • 那么长度分别为a+c+b+c b+c+a+c
    • 因为a+c+b=b+c+a以及a+c+b+c=b+c+a+c
    • 所以如果完整遍历完会有两次相遇的机会,第一次就是在c节点的位置,也就是交点
  • 如果不想交,那么两链表长度为a,b
    • 因为a+b=b+a,所以遍历完没有相交,那么就是没有交点

注意

  • 切换的对方的链表,如果是用null节点来跳的
  • 那么可以利用相遇的时候,是否为null节点来判断有没有相交
posted @ 2022-09-09 02:39  躲在墙角的  阅读(12)  评论(0编辑  收藏  举报