如果链接列表有循环(如果最后一个节点是否链接到中间的节点),我们如何才能将其反转?
好吧,我看到solutions in here 和here中的一个检测链表中的循环是为了反转它。 我的疑问是 - 如果您不知道链接列表的结束位置,如何撤销链表。如何甚至可以反转具有循环的链表?
答案 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
这是伪代码,它们可能是逻辑中的小错误,所以不要逐字复制,但这是一个基本的想法。