繁体   English   中英

递归反转链表中数字的顺序

[英]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前者appendreversed 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函数的每个步骤中appendfirst节点。 对于线性复杂度 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM