單鏈表顧名思義就是一個鏈式資料結構,它有一個表頭,並且除了最後一個節點外,所有節點都有其後繼節點。如下圖。
首先,我們寫出鏈表節點的類。單鏈表中的每一個節點,都儲存其資料域和後驅指標
//鏈表節點 class node { public $id; //節點id public $name; //節點名稱 public $next; //下一節點 public function __construct($id, $name) { $this->id = $id; $this->name = $name; $this->next = null; } } 鏈表中還有兩個特別重要的方法,插入和刪除。插入需要找到插入的位置,把前一個元素的next指標指向被插入的節點,並將被插入節點的next指標指向後一個節點,如下圖左側所示。而刪除則是把前一個節點的next指標指向後一個節點,並返回被刪除元素的資料內容,如下圖右側所示。
//單鏈表 class singelLinkList { private $header; //鏈表前端節點 //構造方法 public function __construct($id = null, $name = null) { $this->header = new node ( $id, $name, null ); } //擷取鏈表長度 public function getLinkLength() { $i = 0; $current = $this->header; while ( $current->next != null ) { $i ++; $current = $current->next; } return $i; } //添加節點資料 public function addLink($node) { $current = $this->header; while ( $current->next != null ) { if ($current->next->id > $node->id) { break; } $current = $current->next; } $node->next = $current->next; $current->next = $node; } //刪除鏈表節點 public function delLink($id) { $current = $this->header; $flag = false; while ( $current->next != null ) { if ($current->next->id == $id) { $flag = true; break; } $current = $current->next; } if ($flag) { $current->next = $current->next->next; } else { echo "未找到id=" . $id . "的節點。<br>"; } } //判斷連表是否為空白 public function isEmpty(){ return $this->header == null; } //清空鏈表 public function clear(){ $this->header = null; } //擷取鏈表 public function getLinkList() { $current = $this->header; if ($current->next == null) { echo ("鏈表為空白!"); return; } while ( $current->next != null ) { echo 'id:' . $current->next->id . ' name:' . $current->next->name . "<br>"; if ($current->next->next == null) { break; } $current = $current->next; } } //擷取節點名字 public function getLinkNameById($id) { $current = $this->header; if ($current->next == null) { echo "鏈表為空白!"; return; } while ( $current->next != null ) { if ($current->id == $id) { break; } $current = $current->next; } return $current->name; } //更新節點名稱 public function updateLink($id, $name) { $current = $this->header; if ($current->next == null) { echo "鏈表為空白!"; return; } while ( $current->next != null ) { if ($current->id == $id) { break; } $current = $current->next; } return $current->name = $name; } }$lists = new singelLinkList (); $lists->addLink ( new node ( 5, 'eeeeee' ) ); $lists->addLink ( new node ( 1, 'aaaaaa' ) ); $lists->addLink ( new node ( 6, 'ffffff' ) ); $lists->addLink ( new node ( 4, 'dddddd' ) ); $lists->addLink ( new node ( 3, 'cccccc' ) ); $lists->addLink ( new node ( 2, 'bbbbbb' ) ); $lists->getLinkList (); echo "<br>-----------刪除節點--------------<br>"; $lists->delLink ( 5 ); $lists->getLinkList ();echo "<br>-----------更新節點名稱--------------<br>"; $lists->updateLink ( 3, "222222" ); $lists->getLinkList ();echo "<br>-----------擷取節點名稱--------------<br>"; echo $lists->getLinkNameById ( 5 );echo "<br>-----------擷取鏈表長度--------------<br>"; echo $lists->getLinkLength ();