是否可以反转包含循环的链表?

时间:2011-03-06 09:39:56

标签: algorithm data-structures linked-list

我正在看一些面试问题,其中一个问题是要反转包含一个周期的链接列表。所以假设我有一个如下链接列表:

          F <- E
          |    /\
          V    |
A -> B -> C -> D 

然后撤消列表将创建以下内容:

          F -> E
         /\    |
          |    V
A <- B <- C <- D

这里的问题是节点C应该指向哪个之间存在冲突。那么我们只是消除C和F之间的联系吗?

2 个答案:

答案 0 :(得分:11)

在数学上,您可以将链表(可能包含循环)视为从一组节点到其自身的部分函数,​​其中每个节点映射到其后继节点,并且每个节点最终都可以从起始节点到达。 (最后一个节点没有后继节点)。反转链接列表然后需要反转这个功能,因为跟随一个链接然后向后移动它应该会让你回到你开始的地方。

如果链表不包含循环,则此部分函数是单射的(一对一),这意味着没有两个节点映射到同一个后继节点。内射函数确实可以反转,这就是为什么你可以反转常规链表。但是,如果列表包含一个循环,则有两个节点具有相同的后继节点,因此该函数不是单射的,因此不具有逆。所以不,如果列表有一个循环,你就不能反转链表并希望获得另一个链表。

但是,如果将链接列表视为更一般的图形,其中每个节点可以具有任意数量的传入或传出边缘,则反向确实存在。它不再是一个链表了。

答案 1 :(得分:2)

原始列表为AB CDEF CDEF CDEF ...要反转,您需要一个无限次生成FEDC后跟BA的链接列表,所以我会说不,没有办法建立一个可以生成该序列的链表。