[英]How to reverse a linked list while keeping the original linked list unchanged
[英]Reverse a linked list while preserving the original order
我想將一個鏈接的列表head
反轉為一個新的反向喜歡的列表。 我可以反轉列表,但是這樣做會影響原始列表的head
並且head.next
變為None
。
def reverse(head):
prev = None
current = head
while(current is not None):
next = current.next
current.next = prev
prev = current
current = next
最初:head: 1-->2-->3-->4-->None
反轉后:頭: 1-->None
一條: 4-->3-->2-->1-->None
我基本上希望head為1-->2-->3-->4-->None
。
這是鏈表反轉的代碼:-
class Node:
def __init__(self, data):
self.data = data
self.next = None
def print_llist(head):
while (head):
print(head.data)
head = head.next
def reverse(head):
prev = None
current = head
while (current is not None):
next = current.next
current.next = prev
prev = current
current = next
return prev
llist = Node(1)
second = Node(2)
third = Node(3)
fourth = Node(4)
llist.next = second
second.next = third
third.next = fourth
# print original list
print("Original:")
print_llist(llist)
# print reversed list
print("Reversed")
print_llist(reverse(llist))
# print original list
print("Original:")
print_llist(llist)
輸出:-
Original:
1
2
3
4
Reversed
4
3
2
1
Original:
1
預期產量:-
Original:
1
2
3
4
Reversed
4
3
2
1
Original:
1
2
3
4
在while循環結束后添加current.next=prev
。 並將您的while循環條件更改為while(current.next is not None):
從您的函數而不是prev
返回current
。 另外,添加條件以查看head
是否為None
。
所以您的功能如下
def reverse(head):
if head is None:
return head
prev=None
current=head
while(current.next is not None):
next=current.next
current.next=prev
prev=current
current=next
current.next = prev
return current
首先編寫Node
,以便您可以傳遞data
然后編寫next
構造函數-
class Node:
def __init__(self, data, next = None):
self.data = data
self.next = next
這使我們可以寫-
mylist = Node(1, Node(2, Node(3, Node(4))))
您還將看到我們如何reverse
使用Node
的第二個參數-
def reverse(llist):
def loop (r, node):
if node is None:
return r
else:
return loop (Node(node.data, r), node.next)
return loop (None, llist)
注意,我們如何構造一個新的Node
而不是使用node.data = ...
或node.next = ...
修改node
。 遞歸可以優雅地表達解決方案,而無需更改原始輸入。
我們也可以使用遞歸將鏈接列表轉換為字符串-
def to_str(node):
if node is None:
return "None"
else:
return f"{node.data} -> {to_str(node.next)}"
print(to_str(mylist))
# 1 -> 2 -> 3 -> 4 -> None
讓我們確認reverse
不會改變原始鏈表-
mylist = Node(1, Node(2, Node(3, Node(4))))
revlist = reverse(mylist)
print(to_str(mylist))
# 1 -> 2 -> 3 -> 4 -> None
print(to_str(revlist))
# 4 -> 3 -> 2 -> 1 -> None
print(to_str(mylist))
# 1 -> 2 -> 3 -> 4 -> None
與您的問題並不完全相關,但是您可以考慮直接在Node
上實現__str__
更為“ __str__
”,以便可以使用print
輸出鏈接列表-
class Node:
def __init__(self, data, next = None):
self.data = data
self.next = next
def __str__(self):
return f"{self.data} -> {self.next}"
現在,不希望用戶手動使用to_str
或print_llist
mylist = Node(1, Node(2, Node(3, Node(4))))
print(mylist)
# 1 -> 2 -> 3 -> 4 -> None
print(reverse(mylist))
# 4 -> 3 -> 2 -> 1 -> None
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.