算法问题..链接列表

时间:2010-05-22 17:19:54

标签: algorithm data-structures

情景如下: -

我想要反转单链表的方向,换句话说,在反转之后,所有指针现在应该指向后方..

算法应该采用线性时间。

我已经想过使用另一个数据结构的解决方案A Stack ..在其帮助下,单个链接列表很容易被反转,所有指针都向后指向..但我有疑问,是否以下实现yeild线性时间复杂度..请评论这个..如果有任何其他有效的算法,那么请讨论..

感谢。

6 个答案:

答案 0 :(得分:4)

你可以这样做:只要输入列表中有节点,删除它的第一个节点并将其插入输出列表的开头:

node* reverse(node *in) {
   out = NULL;
   while (in) {
      node = in;
      in = in->next;
      node->next = out;
      out = node;
   }
   return out;
}

答案 1 :(得分:2)

如果将链表的所有节点都放在堆栈中,它将以线性时间运行,因为您只需向后遍历堆栈上的节点。

但是,我认为你不需要堆叠。您需要记住的只是您刚才所在的节点,以反转当前节点的指针。在反转此节点上的指针之前记下下一个节点。

答案 2 :(得分:2)

2次O(N)= O(2 * n)仍为O(N)。因此,首先推送N个元素然后从堆栈中弹出N个元素的确是线性的,正如您所期望的那样。

另请参阅“Big O Notation”维基百科条目中的Multiplication by a Constant部分。

答案 3 :(得分:1)

以前的答案已经(并且正确地)提到使用指针操作的解决方案和使用堆栈的解决方案都是O(n)

剩下的问题是比较reverse()函数的两个不同实现的实际运行时间(机器周期复杂性)性能。

我希望以下两个方面可能相关:

  1. 堆栈实现。可以 要求最大堆栈深度 明确指定?如果是这样,那是如何指定的?如果没有,怎么样 堆栈将内存管理作为 尺寸是否随意变大?

  2. 我想节点必须复制 从列表到堆栈。 [有办法吗? 没有复制?]在那种情况下, 复制节点的复杂性需要 被占了。那是因为 节点的大小可以 (任意)大。

  3. 鉴于这些,通过操纵指针进行逆转似乎对我更有吸引力。

答案 4 :(得分:0)

对于大小为n的列表,您需要npushnpop,这两次都是O(1)次操作,所以整个操作都是O(n)

答案 5 :(得分:0)

您可以使用堆栈来实现O(n)实现。但递归解决方案是使用堆栈(堆栈)!并且,像所有递归算法一样,它等同于循环。但是,在这种情况下,使用递归或显式堆栈会产生O(n)的空间复杂度,这是完全没必要的。