反向链表的不同实现

时间:2015-12-27 21:11:22

标签: php data-structures linked-list

我在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;    
    }
}

我是对的吗?

1 个答案:

答案 0 :(得分:1)

您的代码不起作用,原因有两个:

  1. 您不测试空列表。该方法不考虑$this->_firstNodeNULL
  2. 的情况
  3. 如果列表只包含一个元素,则该方法不起作用。
  4. 如果列表包含两个或多个元素,则该方法仅反转列表的前两个元素,然后它处于无限循环中。这是因为在您的身体的最后一行,您使用$this->_firstNode->next的值更新$oldFirstNode,并在下一次迭代中检查$this->_firstNode->next !== NULL,这与{{不同1}}因为它是NULL的值,并且函数继续在这两个节点上循环。
  5. 对于像这样的算法,最好的方法是使用纸和铅笔绘制列表的元素和指向它们的变量,并按照算法逐步更新它们。

    最后请注意,如果一个算法总是用于某个基本任务,那么找到一个新的,更有效的算法是非常困难的。