[英]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.