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

时间:2019-02-05 12:29:29

标签: python recursion linked-list reverse

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

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

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

有人可以帮助我吗?

谢谢

2 个答案:

答案 0 :(得分:1)

有多种方法可以执行此操作。现在,您只是将它们连接到一个新的元组,而该元组不会创建格式正确的链表。相反,您可以使用第二个功能将前一个private void ClanoviToolStripMenuItem_Click(object sender, EventArgs e) { Clanovi NewMDIChild = new Clanovi() { MdiParent = this }; NewMDIChild.Show(); } append first reversed中移出。另外,您的基本情况似乎是错误的,因为您仅返回单个元素而不是链表。

rest

但是请注意,这具有二次复杂度O(n²),因为您必须在{{1的每一步中,将整个列表(或部分列表)迭代到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, ())))) 的{​​{1}}节点}}函数。对于线性复杂度O(n)版本,您可以在append函数中添加第二个参数(或者,如果不能更改签名,则可以创建第二个函数以由原始函数调用)。这将在第二个参数中建立反向列表,最后只返回该列表。

first

此外,正如评论中所指出的那样,定义递归数据结构的语言比Python更好,在Python中使用列表的方法也更好,但我将假定这只是为了学习,而不是实际用途。 >

答案 1 :(得分:0)

您可以使用简单的递归:

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