是否可以逆转双向循环链表?如果是,那么如何?

时间:2019-08-29 18:00:37

标签: algorithm data-structures doubly-linked-list

我有点困惑,因为我的一位朋友说不可能。因为它是完全对称的。

我已经用Google搜索了一下,但我仍然感到困惑

3 个答案:

答案 0 :(得分:2)

是;只需交换previousnext指针,以及任何headtail指针。您能解释一下您的朋友如何声称该列表是对称的吗?

答案 1 :(得分:2)

这并非不可能,可能需要格外小心地设计算法,但是在大多数(所有)算法中,您都必须迭代和修改数据结构。

您可以简单地交换headtail,然后遍历链接列表,并将nextprevious引用交换为每个 节点。您还需要确保在一个完整的迭代之后停止这样做。

Python中的示例算法如下:

class CircularDoubleLinkedList:

    # ...

    def reverse(self):
        self.head, self.tail = self.tail, self.head
        start = cur = self.head
        if cur is not None:
            cur.next, cur.previous = cur.previous, cur.next
            cur = cur.previous
        while cur is not None and cur is not start:
            cur.next, cur.previous = cur.previous, cur.next
            cur = cur.previous  # move to the next node

答案 2 :(得分:2)

对于列表中的每个节点N,您只需要交换N.nextN.prev。之后,将head的引用更改为新的head.next。如果有tail,则应将其更新为tail.prev

只是为了更好地可视化:

enter image description here