【问题标题】:Swapping pairs in a linked list in Python, one link disappears?在Python中交换链表中的对,一个链接消失了?
【发布时间】:2018-03-20 19:13:01
【问题描述】:

我一直在学习链表,在 python 中实现链表比我预期的要容易。然而,当谈到解决“在链表中交换对”的问题时,由于某种原因,我的第二个链接在交换过程中消失了。我已经盯着这个看很久了,并尝试了我在网上找到的不同解决方案。他们都得到相同的结果,这表明我的问题在于列表本身的实现。或者我在我看不到的地方犯了一个愚蠢的错误!我会很感激有一双新鲜的眼睛。我做错了什么?

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

【问题讨论】:

    标签: python linked-list


    【解决方案1】:

    您的swapPairsI 函数正在返回链接列表的新head。 您需要相应地更新它:

    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()
    

    【讨论】:

    • 天哪,我什至没有想到这一点。呻吟!谢谢,当然这也是我的递归函数的“错误”。
    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多