反转具有循环的链接列表

时间:2012-03-02 04:30:31

标签: c++ c data-structures linked-list

如果链接列表有循环(如果最后一个节点是否链接到中间的节点),我们如何才能将其反转?

好吧,我看到solutions in here here中的一个检测链表中的循环是为了反转它。 我的疑问是 - 如果您不知道链接列表的结束位置,如何撤销链表。如何甚至可以反转具有循环的链表?

2 个答案:

答案 0 :(得分:4)

嗯,首先,您需要在此上下文中定义“反向”的含义。可能你需要做的是

(1)找到使其成为循环的链接

(2)打破那个链接

(3)然后以某种方式反转列表。

有效地做到这意味着找到一种有效的方法来识别周期。但是如果我们假设一个堆栈有一个操作来判断一个节点是否已经存在,那么你可以将节点推入一个堆栈,检查直到你给出一个你已经看过的节点的链接。然后弹出堆栈并以相反的顺序 voila 列出列表。

在伪代码中,您需要一个带有isIn操作的堆栈

   stack:
     init()
     push(node)
     pop() returns node
     isIn(node) returns Boolean

并执行类似

的操作
 do
    get next node
    if node isIn stack
    then
       while stack not empty
           pop node
       break
    else
       push node in stack
    fi
 od

答案 1 :(得分:0)

我认为首先你必须定义用循环反转链表的含义。我们假设你有一个链表:

1->2->3->4->5-|
      ^       |
      |-------|                

因此,如果正常列表将打印:12345345345如果你继续遍历循环,让我们说反向链表将意味着所有箭头都反转了它们的方向,反过来它应该打印54354312

现在你可以这样做:

prev=head;
curr=head->next;
while !curr->visited && curr->next!=end 
    tmp=prev
    prev=curr
    curr=curr->next
    prev->next=tmp
    curr->visited=True

这是伪代码,它们可能是逻辑中的小错误,所以不要逐字复制,但这是一个基本的想法。