如何重新排序列表,使其从第一次出现的最小元素开始,然后重复向后移动一步,向前移动三步? 我只能找到最小的元素(例如,我在下面的测试中得到了5)?那么如何获得清单(5,53,65,33,51,62,61,38,74,45,97,49)?
class ExtendedLinkedList(LinkedList):
def __init__(self, L = None):
super().__init__(L)
def rearrange(self):
node = self.head
if not node:
return None
Min = node.value
while node:
if node.value < Min:
Min = node.value
node = node.next_node
return Min
---------test---------
LLL = ExtendedLinkedList([49, 97, 53, 5, 33, 65, 62, 51, 38, 61, 45, 74])
LLL.print()
print(LLL.rearrange())
答案 0 :(得分:1)
所以你做得比我假设的好your fellow student。你有最低限度的部分。但现在问题是:你是使用双向链表(理智的方式)还是单链表(有趣的方式)?你想给出一个理智的答案,还是一个有趣的答案?
提到的难点是,为了找到最小值,您必须浏览整个列表并跟踪值,但是按顺序然后从那里开始收集值,你需要跟踪节点本身,因为否则,当你到达列表的末尾时,你会知道最小值是什么,但你无法回到那里!这里有一些选择。一个是你可以在经历时存储最小值和最小节点。另一个是你可以只存储节点,并比较节点的值。
现在,完成后,您将拥有最小的节点。
理智的选择:您有一个双重链接列表。每个节点都有一个next_node
指向下一个节点,一个previous_node
指向前一个节点。回头往前很容易,我认为不需要太多解释。
有趣的选择:您有一个单独的链接列表。你必须始终前进!但是没关系,如果你做一些细微的改变。找到最小值,而不是找到最小节点,找到它之前的节点;让我们称之为A.现在开始制作重新排列的列表。首先在A之后加上节点的值,然后输入A的值。现在向前移动两个。在之后添加节点的值,然后添加该节点。等等......通过这种方式,你实际上不必向后移动。
在写这篇文章的过程中,我没有注意到97,49。你还需要绕圈吗?在两种情况下也可以这样做。您可以将最后一个节点的next_node设置为最小查找部分之后的第一个节点,然后在重新排序时,检查以确保您没有完全返回。
因此,我设法让以下相当紧凑的代码工作(我使用nn
代替next_node
和v
代替value
):
def reorder(f):
n,a=f,f
while n.nn:
a,n=[a,n][n.nn.v<a.nn.v],n.nn
n.nn,ff=f,a.nn
while a:
a.nn.nn,a.nn,a=[(a,None,None),(a,a.nn.nn.nn,a.nn.nn)][
(a.nn==ff)or((a.nn.nn!=ff.nn)and(a.nn.nn.nn!=ff.nn))]
return ff