簡體   English   中英

反向鏈接列表,同時保留原始順序

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM