📜  反转双向循环链表(1)

📅  最后修改于: 2023-12-03 15:37:07.540000             🧑  作者: Mango

反转双向循环链表

双向循环链表是一种常见的数据结构,它有些情况下可以方便的解决一些问题。本文介绍如何反转一个双向循环链表,代码示例使用Python语言实现。

基本概念

双向循环链表是由一些节点组成的,每个节点有value和两个指针prevnext,其中prev指向前一个节点,next指向后一个节点,最后一个节点的next指向第一个节点,第一个节点的prev指向最后一个节点。具体可见下图:

双向循环链表示意图

算法思路

反转双向循环链表的思路非常简单,只需要将每个节点的prevnext互换即可。但需要特别注意头节点和尾节点的处理,即头节点的prev指向原链表的尾节点,尾节点的next指向原链表的头节点。

代码实现

下面是Python实现的反转双向循环链表的代码,其中Node为节点的定义:

class Node:
    def __init__(self, value):
        self.value = value
        self.prev = None
        self.next = None

def reverse_doubly_circular_linked_list(head):
    if not head:
        return None

    cur = head
    while cur:
        cur.prev, cur.next = cur.next, cur.prev
        cur = cur.prev  # 光标向前移动

    head.prev, head.next = head.next, head.prev  # 处理头节点和尾节点
    return head.prev  # 返回新的头节点
测试

下面是对反转双向循环链表的测试,我们构造了一个长度为5的双向循环链表:

if __name__ == '__main__':
    node1 = Node(1)
    node2 = Node(2)
    node3 = Node(3)
    node4 = Node(4)
    node5 = Node(5)

    node1.prev = node5
    node1.next = node2
    node2.prev = node1
    node2.next = node3
    node3.prev = node2
    node3.next = node4
    node4.prev = node3
    node4.next = node5
    node5.prev = node4
    node5.next = node1

    new_head = reverse_doubly_circular_linked_list(node1)

    # 验证链表是否反转成功
    cur = new_head
    while cur:
        print(cur.value)
        cur = cur.next

输出结果如下,可见链表已经成功反转:

5
4
3
2
1