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

Is it possible to reverse a doubly circular linked list? if Yes, then how?

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

我用谷歌搜索了一下,但我还是很困惑

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

这并非不可能,它可能需要特别小心地设计算法,但对于大多数(所有)算法而言,您必须迭代和修改数据结构。

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

Python 中的示例算法如下所示:

class CircularDoubleLinkedList:

    # ...

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

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

只是为了更好的可视化: