本篇文章给大家分享的是有关php中怎么实现数据结构的单向链表,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
代码实现
定义节点
class Node { public $data; /** * @var null | Node */ public $next; public function __construct($data) { $this->data = $data; $this->next = null; } }
单链表实现
/** * Class SingleLinkList * 单链接的实现示例,实现简单的填加,插入,删除, 查询,长度,遍历这几个简单操作 */ class SingleLinkList { /** * 链表头结点,头节点必须存在, * @var Node */ public $header; private $size = 0; /** * 构造函数,默认填加一个哨兵节点,该节点元素为空 * SingleLinkList constructor. */ public function __construct() { $this->header = new Node(null); } /** * 在链表末尾添加节点 * @param Node $node * @return int */ public function addNode(Node $node) { $current = $this->header; while ($current->next != null) { $current = $current->next; } $current->next = $node; return ++$this->size; } /** * 在指定位置插入节点 * @param int $index 节点位置,从1开始计数 * @param Node $node * @return int * @throws Exception */ public function insertNodeByIndex($index, Node $node) { if ($index < 1 || $index > ($this->size + 1)) { throw new Exception(sprintf('你要插入的位置,超过了链表的长度 %d', $this->size)); } $current = $this->header; $tempIndex = 1; do { if ($index == $tempIndex++) { $node->next = $current->next; $current->next = $node; break; } } while ($current->next != null && ($current = $current->next)); return ++$this->size; } /** * 删除节点 * @param int $index 节点位置,从1开始计数 * @return int * @throws Exception */ public function deleteNodeByIndex($index) { if ($index < 1 || $index > ($this->size + 1)) { throw new Exception('你删除的节点不存在'); } $current = $this->header; $tempIndex = 1; do { if ($index == $tempIndex++) { $current->next = $current->next->next; break; } } while ($current->next != null && ($current = $current->next)); return --$this->size; } /** * 查询节点 * @param int $index 节点位置,从1开始计数 * @return Node|null * @throws Exception */ public function searchNodeByIndex($index) { if ($index < 1 || $index > ($this->size + 1)) { throw new Exception('你查询的节点不存在'); } $current = $this->header; $tempIndex = 1; do { if ($index == $tempIndex++) { return $current->next; } } while ($current->next != null && ($current = $current->next)); } /** * 获取节点长度 * @return int */ public function getLength() { return $this->size; } /** * 遍历列表 */ public function showNode() { $current = $this->header; $index = 1; while ($current->next != null) { $current = $current->next; echo 'index --- ' . $index++ . ' --- '; echo var_export($current->data); echo PHP_EOL; } } }
示例
$link = new SingleLinkList(); $link->addNode(new Node(1)); $link->addNode(new Node(2)); $link->insertNodeByIndex(3, new Node(3)); $link->addNode(new Node(4)); $link->addNode(new Node(5)); echo $link->getLength(), PHP_EOL; $link->showNode(); echo '-----------', PHP_EOL; var_dump($link->searchNodeByIndex(3)); echo '-----------', PHP_EOL; $link->deleteNodeByIndex(3); $link->showNode();
以上就是php中怎么实现数据结构的单向链表,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。