線性表--鏈表(PHP實現)
阿新 • • 發佈:2018-03-20
操作 ror head ret display OS tst color empty
上一篇文章寫了線性表的基本概念以及用C語言實現鏈表,有興趣的同學可以看看:線性表--鏈表(C語言實現)。
現在,我們來看看用PHP來實現鏈表。
我們都知道,鏈表由一個個結點組成。在c語言中,我們用結構來定義一個結點,那麽在PHP中我們用什麽來定義結點?
當然是類。
<?php //用面向對象的思想定義結點 class Node { public $value; public $next = null; }
先給出創建和遍歷鏈表的代碼,我們再說說鏈表的插入和刪除操作,比起用順序存儲結構實現線性表的插入或者刪除操作(也就是用一維數組實現線性表),鏈表為什麽更快。
<?php/** * LinkedList * Author: TianJiankun */
// 定義結點 class Node { public $value; public $next = null; }
class LinkedList { public $list;
//傳入一個數組,創建鏈表 public function createList($arr) { $head = new Node(); $a = $head; for ($i = 0; $i<count($arr) ; $i++) {$pNode = new Node(); while ($a->next) { $a = $a->next; } $pNode->value = $arr[$i]; $a->next = $pNode; } $this->list = $head; } //打印鏈表的數據 public function printList() { $list = $this->list; $pNode = $list->next; if (! $pNode) { echo "empty list"; } while ($pNode != null) { echo $pNode->value."\r\n"; $pNode = $pNode->next; } } //打印整個鏈表(可以清晰的看到內部結構) public function printStructure() { $list = $this->list; $pNode = $list->next; if (! $pNode) { echo "empty list"; } $str = ‘<pre style="display: block;padding: 9.5px;margin: 44px 0 0 0;">‘; $show_data = print_r($pNode, true); $str .= $show_data; $str .= ‘</pre>‘; echo $str; } } $list = new LinkedList(); $list->createList([1,2,3,4,5]);$list->printStructure(); $list->printList();
我們舉個例子來說明順序存儲結構插入的劣勢之處。
假設你有一個十層書架,並且你有一千本書,你把書按字母A~Z排序,整整齊齊放在書架上。
後來,你買了一本《計算機程序的構造和解釋》,這個時候你要把這本書插入字母J的位置,那麽,你就得在新書插入的這個位置開始,把後面所有的書都往後移動一個位置。也就是說,如果插入的位置後面有500個元素的話,你就得做500個操作。這就是順序存儲結構的插入操作。
而鏈表依靠指針域,就不會這麽麻煩。上代碼。
//在第n個位置插入一個元素,如果成功返回true public function insert($value, $n) { $p = $this->list; $i = 1; while ($p->next && $n>$i) { $p = $p->next; ++$i; } //$q就是第n個元素 $q = $p->next; if (! $q || $n<$i) { echo ‘insert error‘; die; } $s = new Node(); $p->next = $s; $s->value = $value; $s->next = $q; return true; } //刪除第n個元素,如果成功返回被刪除元素的值 public function delete($n) { $p = $this->list; $i = 1; while ($p->next && $n>$i) { $p = $p->next; ++$i; } //$q就是第n個元素 $q = $p->next; if (! $q || $n<$i) { echo ‘delete error‘; die; } $p->next = $q->next; $value = $q->value; unset($q); return $value; }
整體代碼:
<?php class Node { public $value; public $next = null; } class LinkedList { public $list; //傳入一個數組,創建鏈表 public function createList($arr) { $head = new Node(); $a = $head; for ($i = 0; $i<count($arr) ; $i++) { $pNode = new Node(); while ($a->next) { $a = $a->next; } $pNode->value = $arr[$i]; $a->next = $pNode; } $this->list = $head; } //打印鏈表的數據 public function printList() { $list = $this->list; $pNode = $list->next; if (! $pNode) { echo "empty list"; } while ($pNode != null) { echo $pNode->value."\r\n"; $pNode = $pNode->next; } } //打印整個鏈表(可以清晰的看到內部結構) public function printStructure() { $list = $this->list; $pNode = $list->next; if (! $pNode) { echo "empty list"; } $str = ‘<pre style="display: block;padding: 9.5px;margin: 44px 0 0 0;">‘; $show_data = print_r($pNode, true); $str .= $show_data; $str .= ‘</pre>‘; echo $str; } //判斷鏈表是否為空 public function isEmpty() { return $this->list->next == null; } //刪除第n個元素,如果成功返回被刪除元素的值 public function delete($n) { $p = $this->list; $i = 1; while ($p->next && $n>$i) { $p = $p->next; ++$i; } //$q就是第n個元素 $q = $p->next; if (! $q || $n<$i) { echo ‘delete error‘; die; } $p->next = $q->next; $value = $q->value; unset($q); return $value; } //在第n個位置插入一個元素,如果成功返回true public function insert($value, $n) { $p = $this->list; $i = 1; while ($p->next && $n>$i) { $p = $p->next; ++$i; } //$q就是第n個元素 $q = $p->next; if (! $q || $n<$i) { echo ‘insert error‘; die; } $s = new Node(); $p->next = $s; $s->value = $value; $s->next = $q; return true; } //讀取第i個元素 public function getElem($n) { $p = $this->list->next; $i = 1; while ($p && $n>$i) { $p = $p->next; ++$i; } if (! $p && $n<$i) { echo "get error"; die; } $value = $p->value; return $value; } //整表刪除,成功返回true public function clearList() { $p = $this->list->next; while ($p) { $q = $p->next; unset($p); $p = $q; } $this->list->next = null; return true; } } $list = new LinkedList(); $list->createList([1,2,3,4,5]); echo $list->delete(5)."\r\n"; $list->insert(100,2); echo $list->getElem(3); $list->printStructure(); $list->printList(); $list->clearList(); var_dump($list->isEmpty()); $list->printStructure();
線性表--鏈表(PHP實現)