单向链表通过Node和LinkedList类封装节点与操作;数组索引模拟链表用键作逻辑指针;SplDoublyLinkedList提供双向链表功能;递归实现链表反转;生成器支持惰性遍历。

一、使用类封装单向链表节点与操作
单向链表由一系列节点组成,每个节点包含数据和指向下一个节点的引用。通过定义Node类和LinkedList类,可模拟链表的插入、删除、遍历等基本行为。
1、定义Node类,包含$data属性和$next属性,$next初始值为null。
2、定义LinkedList类,在构造方法中初始化$head为null。
3、在LinkedList中实现addFirst($value)方法:创建新Node,将其$next指向当前$head,再将$head更新为该新节点。
4、在LinkedList中实现addLast($value)方法:若$head为null,直接赋值;否则遍历至末尾节点,将新节点赋给其$next。
5、在LinkedList中实现delete($value)方法:处理头节点匹配情况;否则遍历查找前驱节点,修改其$next跳过目标节点。
二、利用数组索引模拟链表结构
不依赖对象引用,改用关联数组存储节点,以字符串键作为“指针”,实现逻辑上的链式关系。适用于内存受限或需序列化场景。
1、声明空数组$nodes = [],并设置$head = null。
2、插入节点时,生成唯一键名(如md5(microtime())),将['data' => $value, 'next' => $current_head]存入$nodes,并更新$head为该键。
3、遍历时从$head开始,每次用当前键获取节点,读取其'data'并跳转到'next'键,直至'next'为null。
4、删除指定值时,需维护前驱键,在遍历中检查当前节点$data是否匹配,匹配则修改前驱节点的'next'为当前节点的'next'。
三、基于SplDoublyLinkedList扩展双向链表功能
SplDoublyLinkedList是PHP标准库提供的双向链表实现,支持前后双向遍历及O(1)头尾操作,无需手动管理指针。
1、实例化对象:$list = new SplDoublyLinkedList()。
2、头部插入:调用$list->push($value)添加至尾部,或$list->unshift($value)添加至头部。
3、尾部移除:调用$list->pop()返回并删除尾节点;头部移除:调用$list->shift()返回并删除头节点。
4、遍历访问:使用foreach ($list as $item) 或配合$list->rewind()、$list->current()、$list->next()进行手动迭代。
5、定位操作:调用$list->offsetGet($index)获取指定索引节点值,注意该操作时间复杂度为O(n)。
四、使用递归方式实现链表反转
链表反转可通过递归思想完成:先反转后续子链,再调整当前节点与子链的连接关系,避免使用临时变量保存中间状态。
1、定义静态方法reverseRecursive($node),参数为当前节点引用。
2、递归终止条件:若$node为null或$node->next为null,直接返回$node。
3、递归调用获取新头节点:$newHead = self::reverseRecursive($node->next)。
4、执行指针翻转:$node->next->next = $node;$node->next = null。
5、返回$newHead作为整个反转后链表的新头节点,原头节点此时变为尾节点且next为null。
五、借助生成器实现惰性链表遍历
当链表节点数量极大或数据来源动态时,可使用生成器yield逐个产出节点值,节省内存并支持流式处理。
1、在LinkedList类中定义getIterator()方法,返回Generator类型。
2、方法内部初始化$current = $this->head,进入while循环。
3、循环中判断$current是否为null,否则yield $current->data,并令$current = $current->next。
4、外部遍历时使用foreach ($list->getIterator() as $value),每次仅加载一个节点值,不预加载全部数据。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











