用递归方式在Python中反转双向链表,而不是使用迭代。

4

如何用递归为双向链表编写反转函数。我参考了关于使用递归反转双向链表的问题,并在Python中重新编写了代码,但它导致了无限循环,所以我重新思考了逻辑,但我有点忘记了prev指针。

class Node:
    def __init__(self, data, prev=None, nxt=None):
        self.val = data
        self.prev = prev
        self.next = nxt


class DoublyLinkedList:
    def __init__(self, head):
        self.head = head

    def print_list(self):
        cur = self.head
        while cur is not None:
            print(cur.val)
            cur = cur.next

    def reverse(self):
        if self.head is None or self.head.next is None: return self.head
        cur = self.head
        def reverse_node(node):
            if node is None: return
            if node.next is None:
                node.prev = None
                return node
            new_head = reverse_node(node.next)
            new_node = node.next
            tmp = new_node.next
            new_node.prev = tmp
            new_node.next = node
            node.next = None
            return new_head
        self.head = reverse_node(cur)

a = Node(1, prev=None)
b = Node(2, prev=a)
c = Node(3, prev=b)
d = Node(4, prev=c)
a.next = b
b.next = c
c.next = d
dll = DoublyLinkedList(a)
dll.print_list()
dll.reverse()
dll.print_list()

通过将 dll.reverse() 更改为 dll.reverse_recursive(),我似乎让它正常工作了。列表倒序打印,头指向具有 val=4 的元素。您能否更详细地描述一下您的代码正在做什么不需要的事情? - Hoog
感谢您的反馈,我打错了“reverse”。在“self.head = head”之后,实际上我认为我通过重写“reverse”函数的逻辑来修复了我的代码。我将删除此帖子。 - A.Lee
2个回答

0

我所做的就是在结尾添加一些打印输出来查看位置。 在我看来,您的代码已经实现了您的期望。在 reverse() 函数之后,头部似乎清楚地指向 d 而不是 a

class Node:
    def __init__(self, data, prev=None, nxt=None):
        self.val = data
        self.prev = prev
        self.next = nxt


class DoublyLinkedList:
    def __init__(self, head):
        self.head = head

    def print_list(self):
        cur = self.head
        while cur is not None:
            print(cur.val)
            cur = cur.next

    def reverse(self):
        if self.head is None or self.head.next is None: return
        cur = self.head

        def reverse_node(node):
            if node is None: return node
            node.next, node.prev = node.prev, node.next
            if node.prev is None: return node
            return reverse_node(node.prev)

        self.head = reverse_node(cur)

a = Node(1, prev=None)
b = Node(2, prev=a)
c = Node(3, prev=b)
d = Node(4, prev=c)
a.next = b
b.next = c
c.next = d
dll = DoublyLinkedList(a)
print("Head: ",dll.head.val)
dll.print_list()
dll.reverse()
print()
print("Head: ",dll.head.val)
dll.print_list()
print("Is the head at a? ",dll.head is a)
print("Is the head at d? ",dll.head is d)

输出:

Head:  1
1
2
3
4

Head:  4
4
3
2
1
Is the head at a?  False
Is the head at d?  True

很酷,谢谢。我刚刚更新了我的原始帖子,所以我的原始代码实际上并不起作用。 - A.Lee

0

我将在这里发布我的重写反转逻辑,现在似乎可以工作了。欢迎自由评论。

    def reverse(self):
        if self.head is None or self.head.next is None: return
        cur = self.head

        def reverse_node(node):
            if node is None: return node
            node.next, node.prev = node.prev, node.next
            if node.prev is None: return node
            return reverse_node(node.prev)
        self.head = reverse_node(cur)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接