[英]Reversing order of numbers in linked list recursivly
我想用递归反转链表中数字的顺序。
(1,(2,(3,( )))) ----> (3,(2,(1,( ))))
我的链表是嵌套元组。 First(xs) 返回第一个元素,在上面的例子中,它在右侧是 1 或 3。 Rest(xs) 返回所有其他元素,右侧的 (2,(3,( ))) 或 (2,(1,( ))。
我的代码是这样的:
empty = ()
def reversed(xs):
if xs == (first(xs), empty):
return first(xs)
else:
return reversed(rest(xs)), first(xs)
但它产生以下输出:
((3, 2), 1)
我想,我已经很接近了,但是我已经没有办法解决这个问题了。
有人可以帮助我吗?
谢谢
有不同的方法可以做到这一点。 现在,您只是将它们连接到一个新元组,它不会创建一个正确格式的链表。 相反,您可以使用第二个函数first
append
前者append
到reversed
rest
。 此外,您的基本情况似乎是错误的,因为您只返回一个元素而不是链表。
def reversed(xs):
if xs == empty:
return empty
else:
return append(reversed(rest(xs)), first(xs))
def append(xs, x):
if xs == empty:
return (x, empty)
else:
return first(xs), append(rest(xs), x)
>>> reversed((1, (2, (3, (4, empty)))))
(4, (3, (2, (1, ()))))
但是请注意,这具有二次复杂度 O(n²),因为您必须迭代整个列表(或部分列表)以在reversed
函数的每个步骤中append
第first
节点。 对于线性复杂度 O(n) 版本,您可以向reversed
函数添加第二个参数(或者,如果无法更改签名,则创建由原始函数调用的第二个函数)。 这将在第二个参数中构建反向列表,最后只返回该列表。
def reversed(xs, tail=empty):
if xs == empty:
return tail
else:
return reversed(rest(xs), (first(xs), tail))
此外,正如评论中所指出的,有比 Python 更好的定义递归数据结构的语言,以及在 Python 中使用列表的更好方法,但我假设这仅用于学习而不是用于实际用途。
您可以使用简单的递归:
d = (1,(2,(3,())))
def reverse(_d, _c = ()):
a, b = _d
return (a, _c) if not b else reverse(b, (a, _c))
print(reverse(d))
输出:
(3, (2, (1, ())))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.