这是我的节点类:
class Node:
def __init__(self, initData, initNext):
""" Constructs a new node and initializes it to contain
the given object (initData) and link to the given next node. """
self.data = initData
self.cover = True
self.next = initNext
# Additional attributes
def getData(self):
""" Returns the element """
return self.data
def getNext(self):
""" Returns the next node """
return self.next
def getDisplay(self):
#TODO
if self.cover == True:
return '_'
elif self.cover == False:
return self.data
def setData(self, newData):
""" Sets newData as the element """
self.data = newData
def setNext(self, newNext):
""" Sets newNext as the next node """
self.next = newNext
def setDisplay(self, newDisplay):
#TODO
if newDisplay == self.data:
self.cover = False
elif newDisplay != self.data:
self.cover = True
我有一个单链列表,需要使用插入排序进行排序。我对常规列表而不是链接列表的插入排序有很好的了解。我发现了另一则帖子,一位用户这样说:
让我们考虑一下插入排序的工作原理:(理论上)它将列表分为三组:排序后的子集(可能为空),当前项和未排序的子集(可能为空)。当前项目之前的所有内容均已排序。当前项目之后的所有内容都可能会排序,也可能不会排序。该算法检查当前项目,并将其与下一个项目进行比较。请记住,当前项目之后的第一项属于未排序的子集。
让我们假设您按升序对整数进行排序(因此,给定“ 3,1,5,2,4”,您想要获得“ 1,2,3,4,5”)。您将当前项目设置为列表中的第一项。现在开始排序:
如果下一个项目大于当前项目,则无需对该项目进行排序。只需将其设为“当前商品”,然后继续即可。
如果下一项小于当前项,则您需要做一些工作。首先,将下一个项目保存在某个地方(例如在称为temp的指针中),然后通过使current-> next = current-> next-> next从列表中“删除”下一个项目。现在,您需要找到已删除项目的正确位置。您可以通过两种方式执行此操作:
从列表的开头开始,一直向前,直到找到正确的位置。完成后,将项目插入那里,然后继续进行插入排序。如果您有一个单链列表,这是最简单的解决方案。 您向后走,直到找到该物品的正确位置。完成后,将项目插入那里,然后继续进行插入排序。这涉及更多,但是如果您有一个双向链接列表,则可以很好地工作。 您继续此过程,直到到达列表的末尾。到达后,您便知道您已完成插入排序,并且列表按正确的排序顺序。
我希望这会有所帮助。
在这篇文章之后,我尝试编写代码,但不知道如何找到该物品的正确位置,然后将其插入。这是我的代码:
def sort(self):
head = self.linkedList.head
current = head
while current != None:
if current.getNext().getData() > current.getData():
current = current.getNext()
else:
temp = current
current.setNext(current.getNext().getNext())
#I am not sure what to do here
有人可以帮助我吗?
答案 0 :(得分:1)
您必须将后继节点移动到正确的位置。
循环的终止条件为:
while current != None:
while current.getNext() != None:
从列表中提取节点:
temp = current.getNext()
current.setNext(temp.getNext())
然后,您需要区分2种情况。首先处理节点(temp
)是列表的新标题的情况:
if head.getData() > temp.getData():
temp.setNext(head)
self.linkedList.head = temp
head = self.linkedList.head
在另一种情况下,您必须找到前任节点。这意味着必须放置节点(inpos
之后的节点(temp
):
inpos = head
while temp.getData() > inpos.getNext().getData():
inpos = inpos.getNext()
在temp
之后插入inpos
:
temp.setNext(inpos.getNext())
inpos.setNext(temp)
sort
方法:
def sort(self):
head = self.linkedList.head
current = head
while current.getNext() != None:
if current.getNext().getData() > current.getData():
current = current.getNext()
else:
temp = current.getNext()
current.setNext(temp.getNext())
if head.getData() > temp.getData():
temp.setNext(head)
self.linkedList.head = temp
head = self.linkedList.head
else:
inpos = head
while temp.getData() > inpos.getNext().getData():
inpos = inpos.getNext()
temp.setNext(inpos.getNext())
inpos.setNext(temp)
答案 1 :(得分:0)
基本上,您需要两个指针,一个用于外部循环,一个用于内部循环。由于通常使用while循环,例如:while(curr-> next!= null),因此在外部循环的末尾,您需要初始化内部循环以使其指向头部。
答案 2 :(得分:0)
引用的文字简要描述了您需要做什么:
从列表的开头开始,一直到找到正确的位置为止。完成后,将项目插入那里,然后继续进行插入排序。
您已经获得了列表开头的引用,因此请从此处开始再次进行迭代,以找到放置位置不正确的节点的位置。您可能需要一些额外的逻辑来处理在列表的开头插入新内容(因为您需要从外部对象更新head
指针),但除此之外,其他所有操作都应该非常简单。