SPL数据结构之双向链表SplDoublyLinkedList最先添加到链表中的节点叫做Bottom节点(底部),也叫Head节点,最后加入到链表中的节点叫做Top节点(头部),链表指针指向的节点叫做当前节点,链表指针是当前节点的一个标识,可以指向任意节点。任意一个节点都包含节点名称(key或offset)和节点数据(value)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
// 实例化双向链表
$obj = new SplDoublyLinkedList();
// 把新的节点数据添加到链表的顶部(Top)
$obj->push(1);
$obj->push(2);
$obj->push(3);
// 把新的节点数据添加到链表的底部(Bottom)
$obj->unshift(10);
print_r($obj);
// 把节点指针指向Bottom所在的节点
$obj->rewind();
// 获取节点指针指向的节点(当前节点),一般需要和rewind配合使用
echo 'Current:' . $obj->current() . "\r\n";
// 使指针指向下一个节点(靠近top方向)
$obj->next();
echo 'Next node:' . $obj->current() . "\r\n";
// 使指针指向上一个节点(靠近Bottom方向)
$obj->prev();
echo 'Next node:' . $obj->current() . "\r\n";
$obj->next();
$obj->next();
$obj->next();
$obj->next();
echo 'Next node:' . $obj->current() . "\r\n";
// 判断当前节点是否有效
if ($obj->current()) {
echo "Current node valid\r\n";
} else {
echo "Current node invalid\r\n";
}
// 如果当前节点有效,valid()返回true
if ($obj->valid()) {
echo "valid list\r\n";
} else {
echo "invalid list\r\n";
}
$obj->rewind();
echo "Pop value:" . $obj->pop() . "\r\n";
print_r($obj);
echo "Current node:" . $obj->current() . "\r\n";
$obj->next();
$obj->next(); // 2 (top位置)
// 把top位置的节点从链表中删除,并返回。
// 如果current正好指向top位置,那么调用pop之后,current会失效。
$obj->pop();
echo 'next node:' . $obj->current() . "\r\n";
// 把Bottom位置的节点从链表中删除,并返回。
$obj->shift();
print_r($obj);

总结:

  • rewind使链表的当前指针指向链表的底部Bottom(头部)

  • push向链表的顶部Top(尾部)插入一个节点

  • pop获取链表中的顶部Top(尾部)节点,并且从链表中删除这个节点,该操作不改变指针的指向位置。

  • current指向链表当前节点的指针,必须在调用之前先调用rewind。当指向的节点被删除之后,将指向一个空节点。

  • next让链表当前节点的指针指向下一个节点,current的返回值随之改变。

  • unshift向链表的底部Bottom(头部)插入一个节点。

  • shift删除一个链表底部Bottom(头部)的节点。

  • bottom获取链表底部Bottom(头部)元素,当前指针位置不变。

  • top获取链表顶部Top(尾部)元素,当前指针位置不变。