File tree Expand file tree Collapse file tree 2 files changed +154
-0
lines changed
Expand file tree Collapse file tree 2 files changed +154
-0
lines changed Original file line number Diff line number Diff line change 1+ <?php
2+ namespace SingleLinedList ;
3+ /**
4+ * 链表的结点类
5+ */
6+ class Node
7+ {
8+ /**
9+ * 节点中数据
10+ *
11+ * @var null
12+ */
13+ private $ data = null ;
14+ /**
15+ * 后继指针
16+ *
17+ * @var null
18+ */
19+ private $ next = null ;
20+
21+ public function __construct ($ data , $ next )
22+ {
23+ $ this ->data = $ data ;
24+ $ this ->next = $ next ;
25+ }
26+ /**
27+ * 获取节点数据
28+ *
29+ * @return void
30+ */
31+ public function getData ()
32+ {
33+ return $ this ->$ data ;
34+ }
35+
36+ /**
37+ * 设置节点数据
38+ *
39+ * @param mixed $data
40+ * @return void
41+ */
42+ public function setData ($ data )
43+ {
44+ if (empty ($ data )) throw new \Exception ('数据不能为空 ' );
45+ $ this ->$ data = $ data ;
46+ }
47+
48+ /**
49+ * 获取后续指针
50+ *
51+ * @return void
52+ */
53+ public function getNext ()
54+ {
55+ return $ this ->next ;
56+ }
57+
58+ /**
59+ * 设置后续指针
60+ *
61+ * @param Node $next
62+ * @return void
63+ */
64+ public function setNext ($ next )
65+ {
66+ if (empty ($ next )) throw new \Exception ('下个节点不能为空 ' );
67+ $ this ->next = $ next ;
68+ }
69+ }
70+
71+
72+
Original file line number Diff line number Diff line change 1+ <?php
2+ namespace SingleLinedList ;
3+ require Node.php;
4+ /**
5+ * 实现单链表
6+ */
7+ class SingleLinedList
8+ {
9+ /**
10+ * 哨兵节点 - 头结点
11+ *
12+ * @var [type]
13+ */
14+ private $ head = null ;
15+
16+ /**
17+ * 链表长度
18+ */
19+ private $ length ;
20+
21+ /**
22+ * 初始化单链表
23+ *
24+ * @param null $head 头结点
25+ */
26+ public function __construct ($ head = null )
27+ {
28+ // 空链表中生成头结点
29+ if ($ head == null ) {
30+ $ this ->head = new Node ();
31+ } else { // 已有结点生成单链表
32+ $ this ->head = $ head ;
33+ }
34+ $ this ->length = 0 ;
35+ }
36+
37+ /**
38+ * 获取链表长度
39+ *
40+ * @return int
41+ */
42+ public function getLength ()
43+ {
44+ return $ this ->length ;
45+ }
46+
47+ /**
48+ * 插入数据 采用头插法 插入新数据
49+ *
50+ * @param mixed $data
51+ * @return Node
52+ */
53+ public function insert ($ data )
54+ {
55+ return $ this ->insertDataAfter ($ this ->head , $ data );
56+ }
57+
58+ /**
59+ * 在某个节点后插入新的节点
60+ *
61+ * @param Node $originNode 要插入节点
62+ * @param mixed $data 数据
63+ * @return Node
64+ */
65+ public function insertDataAfter (Node $ originNode , $ data )
66+ {
67+ if (empty ($ originNode )) {
68+ return false ;
69+ }
70+ $ newNode = new Node ();
71+ $ newNode ->setData ($ data );
72+ /*
73+ * 将新的节点的后续指针指向要插入的节点的后续指针, 避免指针丢失
74+ * 若先将 originNode->next = newNode newNode->next = originNode->next
75+ * 等同于 newNode->next = originNode->next = newNode 指向newNode
76+ */
77+ $ newNode ->setNext ($ originNode ->getNext ());
78+ $ originNode ->setNext ($ newNode );
79+ $ this ->length ++;
80+ return $ newNode ;
81+ }
82+ }
You can’t perform that action at this time.
0 commit comments