在Python中交换链表中的对时,一个链接会消失吗?
我一直在学习链表,用python实现链表比我想象的要容易。然而,在解决“交换链表中的对”问题时,由于某种原因,我的第二个链接在交换过程中消失了。多年来我一直在关注这个问题,并尝试在网上找到不同的解决方案。它们都得到了相同的结果,这表明我的问题在于列表本身的实现。或者我在某个我看不见的地方犯了一个愚蠢的错误!如果有一双新眼睛,我将不胜感激。我做错了什么在Python中交换链表中的对时,一个链接会消失吗?,python,linked-list,Python,Linked List,我一直在学习链表,用python实现链表比我想象的要容易。然而,在解决“交换链表中的对”问题时,由于某种原因,我的第二个链接在交换过程中消失了。多年来我一直在关注这个问题,并尝试在网上找到不同的解决方案。它们都得到了相同的结果,这表明我的问题在于列表本身的实现。或者我在某个我看不见的地方犯了一个愚蠢的错误!如果有一双新眼睛,我将不胜感激。我做错了什么 class Node: def __init__(self, val): self.value = val
class Node:
def __init__(self, val):
self.value = val
self.next = None
class LinkedList:
def __init__(self, data):
self.head = Node(data)
def printList(self, head):
while head:
print("->" , head.value)
head = head.next;
def swapPairsR(self, node): # recursive
if node is None or node.next is None:
return node
ptrOne = node
ptrTwo = node.next
nextPtrTwo = ptrTwo.next
# swap the pointers here at at the rec call
ptrTwo.next = node
newNode = ptrTwo
ptrOne.next = self.swapPairsR(nextPtrTwo)
return newNode
def swapPairsI(self, head): # iterative
prev = Node(0)
prev.next = head
temp = prev
while temp.next and temp.next.next:
ptrOne = temp.next
ptrTwo = temp.next.next
# change the pointers to the swapped pointers
temp.next = ptrTwo
ptrOne.next = ptrTwo.next
ptrTwo.next = ptrOne
temp = temp.next.next
return prev.next
thisLList = LinkedList(1)
thisLList.head.next = Node(2)
thisLList.head.next.next = Node(3)
thisLList.head.next.next.next = Node(4)
thisLList.head.next.next.next.next = Node(5)
thisLList.printList(thisLList.head)
print("--------------")
thisLList.swapPairsI(thisLList.head)
thisLList.printList(thisLList.head)
编辑:我的输出:
-> 1
-> 2
-> 3
-> 4
-> 5
--------------
-> 1
-> 4
-> 3
-> 5
您的
swapPairsI
函数将返回链接列表的新标题。
您需要相应地更新它:
thisLList.head = thisLList.swapPairsI(thisLList.head)
或者更好的是,您应该更改swapPairsI
函数,使其不必将节点作为参数:
def swapPairsI(self): # iterative
prev = Node(0)
prev.next = self.head
temp = prev
while temp.next and temp.next.next:
ptrOne = temp.next
ptrTwo = temp.next.next
# change the pointers to the swapped pointers
temp.next = ptrTwo
ptrOne.next = ptrTwo.next
ptrTwo.next = ptrOne
temp = temp.next.next
self.head = prev.next
在这种情况下,您只需调用:
thisLList.swapPairsI()
天哪,我都没想过。呻吟!谢谢,当然这也是我的递归函数的“错误”所在。