雙鏈表是一種重要的線性存儲結構,對于雙鏈表中的每個節點,不僅僅存儲自己的信息,還要保存前驅和后繼節點的地址。
PHP SPL中的SplDoublyLinkedList類提供了對雙鏈表的操作。
SplDoublyLinkedList類摘要如下:
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
51
52
53
54
55
56
57
|
SplDoublyLinkedList implements Iterator , ArrayAccess , Countable { public __construct ( void ) public void add ( mixed $index , mixed $newval ) //雙鏈表的頭部節點 public mixed top ( void ) //雙鏈表的尾部節點 public mixed bottom ( void ) //雙聯表元素的個數 public int count ( void ) //檢測雙鏈表是否為空 public bool isEmpty ( void ) //當前節點索引 public mixed key ( void ) //移到上條記錄 public void prev ( void ) //移到下條記錄 public void next ( void ) //當前記錄 public mixed current ( void ) //將指針指向迭代開始處 public void rewind ( void ) //檢查雙鏈表是否還有節點 public bool valid ( 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 push ( mixed $value ) //序列化存儲 public string serialize ( void ) //反序列化 public void unserialize ( string $serialized ) //設置迭代模式 public void setIteratorMode ( int $mode ) //獲取迭代模式SplDoublyLinkedList::IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style) public int getIteratorMode ( void ) //雙鏈表的頭部移除元素 public mixed shift ( void ) //雙鏈表的頭部添加元素 public void unshift ( mixed $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
|
$list = new SplDoublyLinkedList(); $list ->push( 'a' ); $list ->push( 'b' ); $list ->push( 'c' ); $list ->unshift( 'top' ); $list ->shift(); print_r( array ( 'pop' => $list ->pop(), 'count' => $list -> count (), 'isEmpty' => $list ->isEmpty(), 'bottom' => $list ->bottom(), 'top' => $list ->top() )); $list ->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO); print_r( $list ->getIteratorMode()); for ( $list -> rewind (); $list ->valid(); $list ->next()) { echo $list ->current().PHP_EOL; } print_r( $a = $list ->serialize()); //print_r($list->unserialize($a)); $list ->offsetSet(0, 'new one' ); $list ->offsetUnset(0); print_r( array ( 'offsetExists' => $list ->offsetExists(4), 'offsetGet' => $list ->offsetGet(0), )); print_r( $list ); |