我在php中发现了几个反向链表实现,其中大多数都是相同的,有一些小的差异,如下:
public function reverse() {
if ( $this->_firstNode !== NULL ) {
if ( $this->_firstNode->next !== NULL ) {
$reversed = $temp = NULL;
$current = $this->_firstNode;
while ( $current !== NULL ) {
$temp = $current->next;
$current->next = $reversed;
$reversed = $current;
$current = $temp;
}
$this->_firstNode = $reversed;
}
}
}
但我认为可以改为:
public function reverse() {
while ( $this->_firstNode->next !== NULL ) {
$oldFirstNode = $this->_firstNode;
$this->_firstNode = $oldFirstNode->next;
$oldFirstNode->next = NULL;
$this->_firstNode->next = $oldFirstNode;
}
}
我是对的吗?
答案 0 :(得分:1)
您的代码不起作用,原因有两个:
$this->_firstNode
为NULL
。$this->_firstNode->next
的值更新$oldFirstNode
,并在下一次迭代中检查$this->_firstNode->next !== NULL
,这与{{不同1}}因为它是NULL
的值,并且函数继续在这两个节点上循环。对于像这样的算法,最好的方法是使用纸和铅笔绘制列表的元素和指向它们的变量,并按照算法逐步更新它们。
最后请注意,如果一个算法总是用于某个基本任务,那么找到一个新的,更有效的算法是非常困难的。