反向链表
Reverse LinkedList
下面给出了两个反向链表的代码,第一个正确工作,第二个不正确。有人可以解释为什么会这样吗?
工作代码:
def rev(curr, prev):
if not curr:
return prev
next = curr.next
curr.next = prev
prev = curr
curr = next
return rev(curr, prev)
无效代码:
def rev(curr, prev):
if not curr:
return prev
# next = curr.next
curr.next = prev
# prev = curr
# curr = next
return rev(curr.next,curr)
I am calling both above function in this way :
rev(head,None)
输入:
1->2->3->4->None
第一个代码的输出:
4->3->2->1->None
第二个代码的输出:
1->None
第二个代码的期望输出:
4->3->2->1->None
在第二个代码中,您注释了将下一个指针分配给当前指针的行,而不是使用循环来迭代整个列表。这就是为什么它只显示列表的第一项。
您可以在下面的 link 中找到 linked 列表的视频动画,这有助于您理解反向 linked 列表的概念。
参考 Link : https://www.geeksforgeeks.org/reverse-a-linked-list/
代码:
class Node:
# Constructor to initialize the node object
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
# Function to initialize head
def __init__(self):
self.head = None
# Function to reverse the linked list
def reverse(self):
prev = None
current = self.head
while(current is not None):
next = current.next
current.next = prev
prev = current
current = next
self.head = prev
# Function to insert a new node at the beginning
def add(self, new_data):
new_node = Node(new_data)
new_node.next = self.head
self.head = new_node
# Utility function to print the linked LinkedList
def printList(self):
temp = self.head
while(temp):
print(temp.data)
temp = temp.next
# Driver program to test above functions
llist = LinkedList()
llist.add(20)
llist.add(4)
llist.add(15)
llist.add(85)
print("Given Linked List")
llist.printList()
llist.reverse()
print("\nReversed Linked List")
llist.printList()
输出:
Given Linked List
85
15
4
20
Reversed Linked List
20
4
15
85
您正在执行递归调用 return rev(curr.next,curr)
之后:
curr.next = prev
因此,在您的初始调用 rev(head, None)
中,您设置了 head.next = None
,然后使用 None
调用 rev
(并返回 head)。
更改为:
def rev(curr, prev):
if not curr:
return prev
next = curr.next
curr.next = prev
return rev(next,curr)
下面给出了两个反向链表的代码,第一个正确工作,第二个不正确。有人可以解释为什么会这样吗?
工作代码:
def rev(curr, prev):
if not curr:
return prev
next = curr.next
curr.next = prev
prev = curr
curr = next
return rev(curr, prev)
无效代码:
def rev(curr, prev):
if not curr:
return prev
# next = curr.next
curr.next = prev
# prev = curr
# curr = next
return rev(curr.next,curr)
I am calling both above function in this way :
rev(head,None)
输入:
1->2->3->4->None
第一个代码的输出:
4->3->2->1->None
第二个代码的输出:
1->None
第二个代码的期望输出:
4->3->2->1->None
在第二个代码中,您注释了将下一个指针分配给当前指针的行,而不是使用循环来迭代整个列表。这就是为什么它只显示列表的第一项。
您可以在下面的 link 中找到 linked 列表的视频动画,这有助于您理解反向 linked 列表的概念。
参考 Link : https://www.geeksforgeeks.org/reverse-a-linked-list/
代码:
class Node:
# Constructor to initialize the node object
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
# Function to initialize head
def __init__(self):
self.head = None
# Function to reverse the linked list
def reverse(self):
prev = None
current = self.head
while(current is not None):
next = current.next
current.next = prev
prev = current
current = next
self.head = prev
# Function to insert a new node at the beginning
def add(self, new_data):
new_node = Node(new_data)
new_node.next = self.head
self.head = new_node
# Utility function to print the linked LinkedList
def printList(self):
temp = self.head
while(temp):
print(temp.data)
temp = temp.next
# Driver program to test above functions
llist = LinkedList()
llist.add(20)
llist.add(4)
llist.add(15)
llist.add(85)
print("Given Linked List")
llist.printList()
llist.reverse()
print("\nReversed Linked List")
llist.printList()
输出:
Given Linked List
85
15
4
20
Reversed Linked List
20
4
15
85
您正在执行递归调用 return rev(curr.next,curr)
之后:
curr.next = prev
因此,在您的初始调用 rev(head, None)
中,您设置了 head.next = None
,然后使用 None
调用 rev
(并返回 head)。
更改为:
def rev(curr, prev):
if not curr:
return prev
next = curr.next
curr.next = prev
return rev(next,curr)