用PHP实现单向链表
2018-06-22 04:53:46来源:未知 阅读 ()
供参考,代码还可继续打磨
同时放在了我的github上:https://github.com/hheedat/php_code/blob/master/58_linked_list.php
<?php class Node { public $data; public $next; } class LinkedList { private $_head; private $_tail; private $_length; function init() { $this->_head = $this->_tail = null; $this->_length = 0; } function makeNode($data) { $node = new Node(); $node->data = $data; return $node; } function push($node) { if ($this->_length == 0) { $this->_head = $this->_tail = $node; } else { $this->_tail->next = $node; $this->_tail = $node; } ++$this->_length; } function pop() { if ($this->_length == 0) { return false; } elseif ($this->_length == 1) { $node = $this->makeNode($this->_tail->data); $this->_head = $this->_tail = null; --$this->_length; return $node; } elseif ($this->_length > 1) { $node = $this->makeNode($this->_tail->data); $secondTail = $this->_head; while ($secondTail->next != $this->_tail) { $secondTail = $secondTail->next; } $this->_tail = $secondTail; $this->_tail->next = null; --$this->_length; return $node; } } function unshift($node) { if ($this->_length == 0) { $this->_head = $this->_tail = $node; } else { $node->next = $this->_head; $this->_head = $node; } ++$this->_length; } function shift() { if ($this->_length == 0) { return false; } else { $node = $this->makeNode($this->_head->data); $this->_head = $this->_head->next; --$this->_length; return $node; } } function map($func) { $node = $this->_head; $index = 0; while ($node != null) { $func($node->data, $index++); $node = $node->next; } } function reverse() { if ($this->_length == 0) return; $node = $this->_head; $next = $node->next; while ($next != null) { $third = $next->next; $next->next = $node; $node = $next; $next = $third; } $this->_tail = $this->_head; $this->_tail->next = null; $this->_head = $node; } function reverseRecursion() { if ($this->_length == 0) return; $head = $this->_head; $tail = $this->_tail; function reverse($next, $node, $tail) { if ($node == $tail || $node == null) { return; } else { reverse($next->next, $next, $tail); $next->next = $node; } } reverse($head->next, $head, $tail); $this->_tail = $head; $this->_tail->next = null; $this->_head = $tail; } function getLength() { return $this->_length; } } //test code $linkedList = new LinkedList(); for ($i = 0; $i < 5; ++$i) { $node = $linkedList->makeNode(($i + 1) . ' apple'); $linkedList->push($node); $node = $linkedList->makeNode(($i + 1) . ' banana'); $linkedList->unshift($node); } echo "linked list length is " . $linkedList->getLength() . " \n"; $linkedList->map(function ($val, $index) { echo "index is : $index \t value is : $val \n"; }); echo "shift , value is : " . $linkedList->shift()->data . "\n"; echo "pop , value is : " . $linkedList->pop()->data . "\n"; echo "shift , value is : " . $linkedList->shift()->data . "\n"; echo "pop , value is : " . $linkedList->pop()->data . "\n"; echo "linked list length is " . $linkedList->getLength() . " \n"; $linkedList->map(function ($val, $index) { echo "index is : $index \t value is : $val \n"; }); $linkedList->reverse(); echo "linked list length is " . $linkedList->getLength() . " after reverse\n"; $linkedList->map(function ($val, $index) { echo "index is : $index \t value is : $val \n"; }); $linkedList->reverseRecursion(); echo "linked list length is " . $linkedList->getLength() . " after reverse recursion\n"; $linkedList->map(function ($val, $index) { echo "index is : $index \t value is : $val \n"; });
预期的输出是:
linked list length is 10
index is : 0 value is : 5 banana
index is : 1 value is : 4 banana
index is : 2 value is : 3 banana
index is : 3 value is : 2 banana
index is : 4 value is : 1 banana
index is : 5 value is : 1 apple
index is : 6 value is : 2 apple
index is : 7 value is : 3 apple
index is : 8 value is : 4 apple
index is : 9 value is : 5 apple
shift , value is : 5 banana
pop , value is : 5 apple
shift , value is : 4 banana
pop , value is : 4 apple
linked list length is 6
index is : 0 value is : 3 banana
index is : 1 value is : 2 banana
index is : 2 value is : 1 banana
index is : 3 value is : 1 apple
index is : 4 value is : 2 apple
index is : 5 value is : 3 apple
linked list length is 6 after reverse
index is : 0 value is : 3 apple
index is : 1 value is : 2 apple
index is : 2 value is : 1 apple
index is : 3 value is : 1 banana
index is : 4 value is : 2 banana
index is : 5 value is : 3 banana
linked list length is 6 after reverse recursion
index is : 0 value is : 3 banana
index is : 1 value is : 2 banana
index is : 2 value is : 1 banana
index is : 3 value is : 1 apple
index is : 4 value is : 2 apple
index is : 5 value is : 3 apple
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP写UltraEdit插件脚本实现方法 2020-03-29
- php 带逗号千位符数字的处理方法 2020-03-28
- PHP三元运算符的结合性介绍 2020-03-28
- PHP静态延迟绑定和普通静态效率的对比 2020-03-28
- 基于php流程控制语句和循环控制语句 2020-03-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash