php鏈表結構 雙鏈表(二)
雙鏈表結構,我們這邊定義一個節點類,屬性有當前值(data)和指向下一個節點的(next), 和指向上一個節點的(previous)。
class Node {
//當前節點的值
public $data;
//指向的下一個節點
public $next = NULL;
//指向的上一個節點
public $previous = NULL;
//給節點添加值
public function __construct(string $data = NULL) {
$this->data = $data;
}
}
之后是鏈表結構類 ,我們定義一個頭節點,以頭節點開始,next指向下一個節點,previous指向上一個節點,具體看情況添加你所需要的其他屬性
class DoubleLinkedLIst {
//頭節點
public $headNode = NULL;
//初始雙鏈表的頭節點
public function __construct($data) {
$this->headNode = new Node($data);
}
}
1. 往雙鏈表添加節點(是鏈表的后面添加)
//往雙鏈表的尾部中添加節點
public function insertNode($data) {
$newNode = new Node($data);
$currentNode = $this->headNode;
while ($currentNode->next != NULL) {
$currentNode = $currentNode->next;
}
$currentNode->next = $newNode;
$newNode->previous = $currentNode;
}
$double_link = new DoubleLinkedLIst(1);
$double_link->insertNode(2);
$double_link->insertNode(3);
結果:
object(DoubleLinkedLIst)#1 (1) {
["headNode"]=>
object(Node)#2 (3) {
["data"]=>
string(1) "1"
["next"]=>
object(Node)#3 (3) {
["data"]=>
string(1) "2"
["next"]=>
object(Node)#4 (3) {
["data"]=>
string(1) "3"
["next"]=>
NULL
["previous"]=>
*RECURSION*
}
["previous"]=>
*RECURSION*
}
["previous"]=>
NULL
}
}
2. 根據值來查詢出鏈表的當前節點
public function find($data) {
$currentNode = $this->headNode;
while ($currentNode != NULL) {
if ($currentNode->data == $data) {
return $currentNode;
}
$currentNode = $currentNode->next;
}
return NULL;
}
3. 往指定的值之前添加節點
public function insertNodeBefore($data, $query) {
$queryNode = $this->find($query);
if ($queryNode == NULL) {
echo "未找到指定節點的位置" . PHP_EOL;
return false;
}
$newNode = new Node($data);
if ($queryNode->previous == NULL) {
$newNode->next = $this->headNode;
$this->headNode = $newNode;
} else {
$queryNode->previous->next = $newNode;
$newNode->previous = $queryNode->previous;
$newNode->next = $queryNode;
$queryNode->previous = $newNode;
}
}
$double_link = new DoubleLinkedLIst(1);
$double_link->insertNode(2);
$double_link->insertNode(3);
$double_link->insertNodeBefore(5, 2);
var_dump($double_link);
結果:
object(DoubleLinkedLIst)#1 (1) {
["headNode"]=>
object(Node)#2 (3) {
["data"]=>
string(1) "1"
["next"]=>
object(Node)#5 (3) {
["data"]=>
string(1) "5"
["next"]=>
object(Node)#3 (3) {
["data"]=>
string(1) "2"
["next"]=>
object(Node)#4 (3) {
["data"]=>
string(1) "3"
["next"]=>
NULL
["previous"]=>
*RECURSION*
}
["previous"]=>
*RECURSION*
}
["previous"]=>
*RECURSION*
}
["previous"]=>
NULL
}
}
4. 刪除指定值的節點
public function display($query) {
$queryNode = $this->find($query);
if ($queryNode == NULL) {
echo "未找到指定節點的位置" . PHP_EOL;
return false;
}
if ($queryNode->previous == NULL) {
$tempNode = $this->headNode->next;
$tempNode->previous = NULL;
$this->headNode = $tempNode;
} elseif ($queryNode->next == NULL) {
$queryNode->previous->next = NULL;
} else {
$queryNode->previous->next = $queryNode->next;
$queryNode->next->previous = $queryNode->previous;
}
}
本次只列出這幾種方式,還有其他方式,在此就不一一舉例,有興趣的可以自己搞搞啊。
上一篇:PHP 鏈表結構之單鏈表(一)
下一篇:PHP 鏈表結構之環型鏈表(三)
author: clown