反向双重连锁的cilcurar列表

时间:2014-04-07 14:16:08

标签: c++

假设我们有两个双键循环列表。我们想在O(1)中反转它们。然后我们希望能够写出这样的信件。 (O(n)(以相反的顺序,因为它们是相反的)。很容易,但我们必须能够将这些列表合并为一个并写入其中。让我举几个例子:

让我们说你有两个输入列表。可以进行"操作": join(示例显示它是如何工作的),显示和反转: 好: 第一个例子:

L1: a b c d e 
L2: f g h i j 
Display L1 ( result: )  a b c d e
Join L1 L2 ( attach the second to the end of the first) 
Display L1 :  a b c d e f g h i  j
Reverse L1 ( reversing )
Display L1 : j i h g f e d c b a 

第二名:

L1 a b c 
L2 d e f 
L3 w
Reverse L1
Join L1 L2
Display L1: c b a d e f 
Join L1 L3:
Display L1 : c b a d e f w

连接和反向的时间复杂度为O(1),显示显然是O(n)。

1 个答案:

答案 0 :(得分:1)

使用一个附加参数直接反转循环双链表:顺序

双链表的每个节点都有两个指针:前进后退

  • 如果订单为1,我们会将转发视为指向 下一个元素
  • 如果订单为-1,我们会将后退视为指向 下一个元素

我们还跟踪链表的end_point和start_point。反转列表基本上是交换start_point和end_point并颠倒顺序

order = -1 * order
tmp = start_point 
start_point  = end_point
end_point = tmp

合并列表与合并通常的双链表没有区别,但您必须考虑订单。你基本上有3个案件要处理:

  1. 两人正在前进
  2. 两人都向后移动
  3. 一个向前移动而另一个向后移动