我的理解是,双向链表中的每个数据带有两个标识(域),一个可以指向前一个数据的地址,另一个可以指向后一个数据的地址,以是相对单向链表来说,可以比较方便的查找到前一个数据和数据地址,但是比单向链表多利用了内存,也便是空间换韶光的做法。
php利用SplDoublyLinkedList类可以实现双向链表。
<?php

$obj = new SplDoublyLinkedList();//建立一个双向链表工具
echo '<pre>';
$obj->push(1);//上部压入 链表中的元素为[0]=>1,
$obj->push(2);//上部压入 链表中的元素为[0]=>1,[1]=>2
$obj->push(3);//上部压入 链表中的元素为[0]=>1,[1]=>2,[2]=>3
$obj->unshift(8);//底部压入 链表中的元素为[0]=>8,[1]=>1,[2]=>2,[3]=>3
$obj->unshift(9);//底部压入 链表中的元素为[0]=>9,[1]=>8,[2]=>1,[3]=>2,[4]=>3
$obj->unshift(10);//底部压入链表中的元素为[0]=>10,[1]=>9,[2]=>8,[3]=>1,[4]=>2,[5]=>3
//此时链表中的元素自下向上依次为:[0]=>10,[1]=>9,[2]=>8,[3]=>1,[4]=>2,[5]=>3
$obj->rewind();//将指针指向底部第一个元素,这里指的是10这个元素
$obj->next();//将指针向上移动一个单位,此时指针指向9这个元素
$obj->prev();//将指针向下移动一个单位,此时指针指向10这个元素
echo $obj->bottom();//查看底部元素,此时指针位置未变
echo $obj->top();//查看上部元素,此时指针位置不变
$obj->add(1,12);//添加元素,在0的位置上添加一个12,链表中的元素为[0]=>10,[1]=>12,[2]=>9,[3]=>8,[4]=>1,[5]=>2,[6]=>3
$obj->next();
echo $obj->key();//查看当前指针位置
echo $obj->current();//查看当前指针所对应的元素
echo $obj->valid();//查看当前节点是否为有效节点,是的话,返回true;
$obj->pop();//删除最上部的一个,top,如果删除当前节点,则指针为空。
$obj->shift();//删除最底部的一个元素,bottom
贴图: