【问题标题】:Swapping nodes in singly linked list with a while loop用while循环交换单链表中的节点
【发布时间】:2020-04-04 14:59:10
【问题描述】:

我正在尝试交换单链表中的节点对,这样如果链表是 1->2->3->4,那么输出的是 2->1->4-> 3.我已经设法通过交换第一对输出 2->1->3->4 但现在我不确定如何循环整个列表并执行剩余的交换。我的直觉告诉我,我需要使用 while 循环,但我不确定如何实现。

class Node():
    def __init__(self,dataval=None):
        self.dataval=dataval
        self.nextval=None

class Linkedlist():
    def __init__(self,headval=None):
        self.headval=headval

    def printlist(self):
        headval=self.headval
        while headval is not None:
            print(headval.dataval)
            headval=headval.nextval

    def swapnodes(self,headval):
        temp=headval.nextval
        headval.nextval=temp.nextval
        temp.nextval=headval
        self.headval=temp
        

List1=Linkedlist()
Node1=Node("1")
Node2=Node("2")
Node3=Node("3")
Node4=Node("4")
List1.headval=Node1
Node1.nextval=Node2
Node2.nextval=Node3
Node3.nextval=Node4
List1.swapnodes(Node1)
List1.printlist()

【问题讨论】:

  • 为了交换 2 个节点,顺序是首先交换指向这 2 个节点的任何内容,然后交换这 2 个节点的“下一个”引用。这消除了对相邻节点和非相邻节点的不同处理。如果“head”不是节点,如果“head”指向要交换的2个节点之一,则需要特殊处理。

标签: python-3.x linked-list swap


【解决方案1】:

在进行这种成对交换时,您需要跟踪三个不同的节点。您需要当前正在交换的两个节点以及这对之前的节点。您当前的函数swapnodes() 使用headvaltemp 来跟踪正在交换的两个链表节点,这足以进行第一次交换。但是,当您尝试交换 Node3 和 Node4 时,您仍然需要对 Node1 的引用,即交换当前对之前的节点以便能够将 Node1.next 设置为 Node4。你是正确的,你需要某种 while 循环来完成这个。使用虚拟头节点也有助于推广该算法。

  1. 初始化 dummyHead (dummyHead.next = head)
  2. 将 prevNode 设置为 dummyHead
  3. 将 currNode 设置为 head
  4. 使用while循环迭代链表:交换一对节点,更新prevNode,更新currNode
  5. 返回 dummyHead.next

【讨论】:

  • 为什么需要返回 dummyHead.next @anusha
  • 当你创建一个 dummyHead 节点时,你并不关心它所持有的值。但是, dummyHead.next 开始指向列表的实际头部。通过这种方式,您不必考虑要交换的第一组节点与以下对不同,并且您不必担心在交换所有对后保存列表的新头部以返回。
猜你喜欢
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2017-12-07
  • 2018-11-05
  • 1970-01-01
相关资源
最近更新 更多