反向链接列表递归

时间:2017-01-24 14:28:21

标签: 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 个答案:

答案 0 :(得分:4)

问题是您的链接列表的根目录也发生了变化:在更改列表后,您的元素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)

所以你的功能是正确的,但操作后你的手中有错误的链表元素。

答案 1 :(得分:2)

这看起来像是一些函数式编程练习,因此我向您展示了一个功能性解决方案(它复制了列表):

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

答案 2 :(得分:0)

而不是创建新链:

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