0%

SPL标准库之SplDoublyLinkedList(双向链表)

双向链表其实就是数据本身具备了左边和右边的双向指针。类似Redis的列表,它就是双向链表。

我们现在就学习一下SPL内置的SplDoublyLinkedList类。

首先介绍一下这个类都有哪些方法:

1
// 实例化方法
2
$dll = new SplDoublyLinkedList();
3
4
//尾部增加数据,类似array_push()方法
5
$dll->push($value);
6
//开头插入数据,类似array_unshift()方法
7
$dll->unshift($value);
8
9
//检测指定位置是否存在值,类似array_key_exists()方法
10
$dll->offsetExists($key);
11
//获取指定位置的值,类似$dll[$key]
12
$dll->offsetGet($key);
13
//修改指定位置的值,类似$dll[$key] = $value
14
$dll->offsetSet($key, $value);
15
//删除指定位置的值,类似unset($dll[$key])
16
$dll->offsetUnset($key);
17
18
//获取双向链表中值的数量
19
$dll->count();
20
//检测双向链表是否为空
21
$dll->isEmpty();
22
23
//序列化存储,类似serialize()
24
$dll->serialize();
25
//存储反序列化类似unserialize()
26
$dll->unserialize($str);
27
28
//设置迭代器模式
29
$dll->setIteratorMode($mode);
30
//获取迭代器模式
31
$dll->getIteratorMode();
32
33
//初始化链表,只有先执行此方法,才能使用操作游标的方法
34
$dll->rewind();
35
//获取当前游标的索引
36
$dll->key();
37
//获取当前游标的值
38
$dll->current();
39
//将游标移动到下一个节点
40
$dll->next();
41
//将游标移动到上一个节点
42
$dll->prev();
43
//检测当前游标后面是否还有节点
44
$dll->valid();
45
46
//返回第一个节点的值
47
$dll->bottom();
48
//返回最后一个节点的值
49
$dll->top();
50
51
//将双向链表中的最后一个节点弹出,类似array_pop()
52
$dll->pop();
53
//将双向链表中的第一个节点弹出,类似array_shift()
54
$dll->shift();
55
56
//在双向链表的指定位置插入值
57
$dll->add($index, $value);

Iterator 模式

  • 迭代的方向:
    • SplDoublyLinkedList::IT_MODE_LIFO (堆栈 style)
    • SplDoublyLinkedList::IT_MODE_FIFO (队列 style)
  • 迭代器的行为
    • SplDoublyLinkedList::IT_MODE_DELETE (元素由迭代器删除)
    • SplDoublyLinkedList::IT_MODE_KEEP (元素由迭代器遍历)

默认模式是:SplDoublyLinkedList::IT_MODE_FIFO | SplDoublyLinkedList::IT_MODE_KEEP