链表种类
单链表
每个链表节点中存在 next 指针指向下一个链表节点。
双链表
每个链表节点中存在 next 指针指向下一个链表节点,存在 prev 指针指向上一个链表节点。
循环链表
链表中最后一个节点的 next 指针指向第一个元素。
链表操作
设计链表
class LinkNode<T> {
constructor(
public val: T | null = null,
public next: LinkNode<T> | null = null,
public prev: LinkNode<T> | null = null
) {}
}
虚拟头节点
根据链表定义,遍历链表的方式就是不停找链表的 next 指针,对链表下一个节点进行处理。但是如果直接遍历链表会存在一个问题,就是头节点的处理逻辑和后续链表节点不一致,需要单独对头节点进行处理。
比如删除链表中的某个节点,这时需要找到被删除节点的父节点,但是对于头节点来说,头节点没有父节点,需要单独处理,所以为了统一链表节点的处理方式,可以定义一个虚拟头节点。以上图单链表为例:
这样就能简化逻辑,方便理解。