【问题标题】:Reversing order of numbers in linked list recursivly递归地反转链表中数字的顺序
【发布时间】:2019-02-05 12:29:29
【问题描述】:

我想用递归反转链表中数字的顺序。

(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)

我想,我已经很接近了,但我已经没有办法解决这个问题了。

谁能帮帮我?

谢谢

【问题讨论】:

  • 你为什么要用python写Haskell代码?结果既不可读也不快。
  • 向我们展示你的链表类。
  • @Aran-Fey 这个 Haskell 代码在哪里?我忘记了一些缩进,你是这个意思吗?它是用python编写的。
  • @DocDriven 没有类。 OP 的链表是一堆嵌套的元组。
  • @Peet,python 是一种多范式语言。它支持多种风格的编程:命令式、面向对象、函数式、过程式等。当然,功能集表明 Python 偏好某些风格而不是其他风格,但不要让这阻止您使用您选择的风格。跨度>

标签: python recursion linked-list reverse


【解决方案1】:

有不同的方法可以做到这一点。现在,您只是将它们连接到一个新的元组,它不会创建一个格式正确的链表。相反,您可以使用第二个函数将appendfirst 转换为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))

另外,正如 cmets 中所指出的,在定义递归数据结构方面存在比 Python 更好的语言,以及在 Python 中使用列表的更好方法,但我假设这只是为了学习而不是为了实际使用。

【讨论】:

    【解决方案2】:

    你可以使用简单的递归:

    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, ())))
    

    【讨论】:

    • 如果我遗漏了什么,请纠正我,但这和我的第二个版本不一样吗?
    • @tobias_k 我发帖时没有看到你的第二个版本,但总体思路肯定是一样的。我认为我的回答更简洁,当然也更短,但是如果你愿意,我可以删除它。
    • 没问题,我只是有点难过。 (顺便说一句,我同意 shorter 部分,但是...)
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2010-09-26
    • 2012-12-14
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多