常见写法
定义链表
一般使用虚拟头结点,方便操作。
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
dummy_head= ListNode(next=head)
查询
node=self.getNode(index)
def getNode(self,index: int)->Node | None:
isLeft = index < self.sz /2
if not isLeft:
index = self.sz -index -1
cur = self.he.next if isLeft else self.ta.prev
while cur != self.he and cur != self.ta:
if index==0:
return cur
index-=1
cur = cur.next if isLeft else cur.prev
return None
判断
if not (fast and fast.next): return
可以要求两个均不为null,再往下进行,否则就返回空。
链表
理论基础
链表是通过指针串联在一起的线性结构,每一个节点由数据域和指针域两部分组成
分类
- 单链表 ,每一个节点的指针域只能指向下一个节点。
- 双链表 ,每一个节点有两个指针域,指向后一个和前一个。
- 循环链表,首尾相连的链表。
链表的存储方式
在内存空间中不连续分布
链表的定义
性能分析
链表与数组
数据类型 | 增删 | 查询 |
---|---|---|
数组 | O(n) | O(1) |
链表 | O(1) | O(n) |
数组适用于数据量固定,频繁查询的场景
链表适用于数据量不固定,频繁增删的场景
判断
链表节点用==去做判断时,判断的是内存地址是否相等,于是可以据此判断链表相交。
力扣链表相交题目
算法
双指针法
可以用来解决很多链表问题,例如寻找距离尾部第 K 个节点、寻找环入口、寻找公共尾部入口等。