Python 递归反向链表

Python 递归反向链表,python,algorithm,linked-list,Python,Algorithm,Linked List,我对Python中递归反转链表的算法有一个问题 def reverse(lis, prev = None): if lis.next != None: reverse(lis.next, lis) lis.next = prev 投入:3 1 4 产出:3 知道它为什么不工作吗?问题是链表的根也发生了变化:在改变链表后,元素3实际上是最后一个元素,函数最好也返回根: def reverse(lis, prev = None): if lis.next !

我对Python中递归反转链表的算法有一个问题

def reverse(lis, prev = None):
    if lis.next != None:
        reverse(lis.next, lis)
    lis.next = prev
投入:3 1 4

产出:3


知道它为什么不工作吗?

问题是链表的根也发生了变化:在改变链表后,元素3实际上是最后一个元素,函数最好也返回根:

def reverse(lis, prev = None):
    if lis.next != None:
        temp = lis.next
        lis.next = prev
        return reverse(temp, lis)
    else:
        return lis # the new root
因此,现在您将其称为:

oldroot = ... #construct linked list
newroot = reverse(oldroot)
print(newroot)

因此,您的函数是正确的,但在操作后,您手中的链表元素是错误的。

这看起来像是一些函数编程练习,因此我向您提供了一个函数解决方案,它复制了列表:

def reverse(link, rest=None):
    if link is None:
        return rest
    return reverse(link.next, LinkedList(link.value, rest))

class LinkedList:
    def __init__(self, value=None, next=None):
        self.next = next
        self.value = value
    def print(self):
        print(self.value)
        if self.next is not None:
            self.next.print()

def to_linked_list(items):
    if len(items) == 0:
        return None
    return LinkedList(items[0], to_linked_list(items[1:]))

to_linked_list([1, 2, 3, 4, 5]).print()
# 1, 2, 3, 4, 5
reverse(to_linked_list([1, 2, 3, 4, 5])).print()
# 5, 4, 3, 2, 1

就地而不是创建新链:

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

@Rasmiranjanayak这个问题肯定不属于codereview,因为它不起作用,问题不是询问关于如何改进代码的一般建议,而是如何修复故障。很高兴提供一个功能解决方案。我给出的一个建议是重写_str__函数,而不是使用.print方法。但是+1!