SplDoublyLinkedList 双向链表

/**
 * 双向链表   其实就是单项链表的改进
SplDoublyLinkedList  implements Iterator  , ArrayAccess  , Countable  {

    方法
    public __construct ( void )

    public void add ( mixed $index , mixed $newval )

    //双链表的尾部节点
    public mixed bottom ( void )

    //双联表元素的个数
    public int count ( void )

    //当前记录
    public mixed current ( void )

    //返回迭代方式
    public int getIteratorMode ( void )

    //检测双链表是否为空
    public bool isEmpty ( void )

    //当前节点索引
    public mixed key ( void )

    //移到下条记录
    public void next ( void )

    //指定index处节点是否存在
    public bool offsetExists ( mixed $index )

    //获取指定index处节点值
    public mixed offsetGet ( mixed $index )

    //设置指定index处值
    public void offsetSet ( mixed $index , mixed $newval )

    //删除指定index处节点
    public void offsetUnset ( mixed $index )

    //从双链表的尾部弹出元素
    public mixed pop ( void )

    //移到上条记录
    public void prev ( void )

    //添加元素到双链表的尾部
    public void push ( mixed $value )

    //将指针指向迭代开始处
    public void rewind ( void )

    //序列化存储
    public string serialize ( void )

    //设置迭代方式
    public void setIteratorMode ( int $mode )

    //双链表的头部移除元素
    public mixed shift ( void )

    //双链表的头部节点
    public mixed top ( void )

    //反序列化
    public void unserialize ( string $serialized )

    //双链表的头部添加元素
    public void unshift ( mixed $value )

    //检查双链表是否还有节点
    public bool valid ( void )
}

 */

$linked_list = new SplDoublyLinkedList();

//推入双向链表的最后一个元素
$linked_list->push('a');
$linked_list->push('b');
$linked_list->push('c');

//双链表的头部移除元素
$linked_list->unshift('e');
$linked_list->unshift('f');

echo '<pre>';
var_dump($linked_list);

$linked_list->add(1,'index');

//双链表的头部移除元素
$linked_list->shift();

var_dump($linked_list);

$res = [
    'pop' => $linked_list->pop(),
    'count' => $linked_list->count(),
    'isEmpty' => $linked_list->isEmpty(),
    'bottom' => $linked_list->bottom(),
    'top' => $linked_list->top(),
];

var_dump($res);

//设置迭代方式
$linked_list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);

var_dump($linked_list->getIteratorMode());

for($linked_list->rewind(); $linked_list->valid(); $linked_list->next()) {
    echo $linked_list->current().PHP_EOL;
}

print_r($a = $linked_list->serialize());

print_r($linked_list->unserialize($a));

$linked_list->offsetSet(0,'new one');

$linked_list->offsetUnset(0);

print_r(array(
    'offsetExists' => $linked_list->offsetExists(4),
    'offsetGet' => $linked_list->offsetGet(0),
));

var_dump($linked_list);