【发布时间】:2012-10-26 11:52:21
【问题描述】:
我写了这个类来实现链表:
class Node{
public $data;
public $link;
function __construct($data, $next = NULL){
$this->data = $data;
$this->link = $next;
}
}
class CircularLinkedList{
private $first;
private $current;
private $count;
function __construct(){
$this->count = 0;
$this->first = null;
$this->current = null;
}
function isEmpty(){
return ($this->first == NULL);
}
function push($data){
//line 30
$p = new Node($data, $this->first);
if($this->isEmpty()){
$this->first = $p;
$this->current = $this->first;
}
else{
$q = $this->first;
//line 38
while($q->link != $this->first)
$q = $q->link;
$q->link = $p;
}
$this->count++;
}
function find($value){
$q = $this->first;
while($q->link != null){
if($q->data == $value)
$this->current = $q;
$q = $q->link;
}
return false;
}
function getNext(){
$result = $this->current->data;
$this->current = $this->current->link;
return $result;
}
}
但是当我尝试推动一些价值时,
$ll = new CircularLinkedList();
$ll->push(5);
$ll->push(6);
$ll->push(7);
$ll->push(8);
$ll->push(9);
$ll->push(10);
//$ll->find(7);
for($j=0;$j<=30;$j++){
$result = $ll->getNext();
echo $result."<br />";
}
脚本在第二次推送时挂起并给出max_execution_time 错误。
如果我将 cals 的第 30 行和第 38 行更改为正常的 LinkedList,则效果很好。 (通过删除最后一个节点链接到第一个节点)。
那么问题是什么以及如何解决呢?
更新:通过将 push() 函数更改为 this ,它可以作为线性链表正常工作:
function push($data){
$p = new Node($data);
if($this->isEmpty()){
$this->first = $p;
$this->current = $this->first;
}
else{
$q = $this->first;
while($q->link != null)
$q = $q->link;
$q->link = $p;
}
$this->count++;
}
【问题讨论】:
-
我的假设是您的 链接 不正确。因此第 38 行是一个无限循环。一些调试可能会证明这一点。
-
我知道问题出在第 38 行。但逻辑似乎是正确的。问题是如何调试它
-
你检查过
SplDoublyLinkedList和朋友吗?你可能不必自己做这一切。可以扩展一个 SPL 类 php.net/manual/en/class.spldoublylinkedlist.php -
@Kris:它不支持循环链表和我需要的一些功能,扩展该类并进行修改可能会再次产生类似的问题!
标签: php linked-list