我遇到了一个算法问题,该算法在Python中递归地反转链接列表。
def reverse(lis, prev = None):
if lis.next != None:
reverse(lis.next, lis)
lis.next = prev
输入:3 1 4
输出: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