1+ <?php
2+
3+ class SNode
4+ {
5+ //数据域
6+ public $ data ;
7+
8+ //指针域,引用SNode对象
9+ public $ next = [];
10+
11+ public function __construct ($ data = null )
12+ {
13+ $ this ->data = $ data ;
14+ }
15+
16+ //获取当前节点索引层数
17+ public function getMaxLevel ()
18+ {
19+ return count ($ this ->next ) - 1 ;
20+ }
21+ }
22+
23+ class SkipList
24+ {
25+ //索引最大层数
26+ public $ indexLevel ;
27+
28+ //头节点
29+ protected $ head ;
30+
31+ public function __construct (int $ indexLevel )
32+ {
33+ $ this ->indexLevel = max ($ indexLevel , 0 );
34+ $ this ->head = new SNode ();
35+ }
36+
37+ public function addData ($ data )
38+ {
39+ $ newNode = new SNode ($ data );
40+ for ($ level = $ this ->getRandomLevel (), $ node = $ this ->head ; $ level >= 0 ; $ level --) {
41+ while (isset ($ node ->next [$ level ]) && $ data < $ node ->next [$ level ]->data ) {
42+ $ node = $ node ->next [$ level ];
43+ }
44+ if (isset ($ node ->next [$ level ])) {
45+ $ newNode ->next [$ level ] = $ node ->next [$ level ];
46+ }
47+ $ node ->next [$ level ] = $ newNode ;
48+ }
49+ return $ newNode ;
50+ }
51+
52+ public function deleteData ($ data )
53+ {
54+ $ deleted = false ;
55+ for ($ level = $ this ->head ->getMaxLevel (), $ node = $ this ->head ; $ level >= 0 ; $ level --) {
56+ while (isset ($ node ->next [$ level ]) && $ data < $ node ->next [$ level ]->data ) {
57+ $ node = $ node ->next [$ level ];
58+ }
59+ if (isset ($ node ->next [$ level ]) && $ data == $ node ->next [$ level ]->data ) {
60+ $ node ->next [$ level ] = isset ($ node ->next [$ level ]->next [$ level ]) ?
61+ $ node ->next [$ level ]->next [$ level ] : null ;
62+ $ deleted = true ;
63+ }
64+ }
65+ return $ deleted ;
66+ }
67+
68+ public function findData ($ data )
69+ {
70+ for ($ level = $ this ->head ->getMaxLevel (), $ node = $ this ->head ; $ level >= 0 ; $ level --) {
71+ while (isset ($ node ->next [$ level ]) && $ data < $ node ->next [$ level ]->data ) {
72+ $ node = $ node ->next [$ level ];
73+ }
74+ if (isset ($ node ->next [$ level ]) && $ data == $ node ->next [$ level ]->data ) {
75+ return $ node ->next [$ level ];
76+ }
77+ }
78+ return false ;
79+ }
80+
81+ protected function getRandomLevel ()
82+ {
83+ return mt_rand (0 , $ this ->indexLevel );
84+ }
85+ }
86+
87+ /**
88+ * 示例
89+ */
90+
91+ $ indexLevel = 2 ;
92+
93+ $ skipList = new SkipList ($ indexLevel );
94+
95+ for ($ i = 10 ; $ i >= 0 ; $ i --) {
96+ $ skipList ->addData ($ i );
97+ }
98+
99+ //打印0到10组成的跳表
100+ var_dump ($ skipList );
101+
102+ //返回SNode对象
103+ var_dump ($ skipList ->findData (5 ));
104+
105+ $ skipList ->deleteData (5 );
106+
107+ //返回false
108+ var_dump ($ skipList ->findData (5 ));
0 commit comments