簡體   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