php双向链表核心是node类含$data、$prev、$next,初始化为null;主类维护$head、$tail、$size,支持头尾插入/删除、双向遍历及arrayaccess/iterator接口。

PHP 中实现双向链表,核心是定义节点结构和维护前后指针关系,利用类封装操作逻辑,比单向链表多一个 prev 指针,支持正向与反向遍历、任意位置高效插入/删除。
节点类设计:包含数据、前驱、后继
每个节点需存储实际数据,并持有指向**前一个节点(prev)** 和**后一个节点(next)** 的引用。注意初始化时 prev 和 next 默认为 null,避免悬空引用。
- 定义
class Node,含public $data、public $prev、public $next - 构造函数接收
$data,自动设$this->prev = $this->next = null - 不建议用数组模拟节点,会丢失类型语义和扩展性
链表主类:管理头尾、计数与基础操作
主类(如 DoublyLinkedList)负责维护 $head、$tail 和 $size,提供插入、删除、查找、遍历等方法。关键在于更新指针时保持一致性。
- 头部插入:新节点 next 指向原 head;若原 head 非空,其 prev 指向新节点;更新 head,size++
- 尾部插入:新节点 prev 指向原 tail;若原 tail 非空,其 next 指向新节点;更新 tail,size++
- 按索引删除:先定位节点,再调整其前后节点的指针;若删 head/tail,同步更新 head/tail 引用
反向遍历与边界处理
双向链表优势之一是可从 tail 开始倒序访问。实现 reverseIterator() 或 getFromTail($index) 时,需确保 tail 不为 null,且循环中每次移动 $current = $current->prev。
立即学习“PHP免费学习笔记(深入)”;
- 空链表时 head/tail 均为 null,所有操作前应校验
- 单节点时 head === tail,删除后需同时置 null
- 遍历类方法建议返回生成器(yield),节省内存,例如:
foreach ($list->reverse() as $val) { ... }
实用增强:支持 ArrayAccess 与迭代器
让链表像数组一样使用(如 $list[5])或直接用于 foreach,需实现 PHP 内置接口:
- 实现
ArrayAccess接口,重写offsetGet、offsetSet等方法 - 实现
Iterator接口,或更简单地使用IteratorAggregate+getIterator()返回内置迭代器 - 注意:
offsetSet对链表意义有限(无随机写入),通常只读实现offsetGet和offsetExists











