如何重新排列列表,使其从最小元素的第一次出现开始,并重复地向后移动一步,向前移动三步? 我只能找到最小的元素(例如,我在下面的测试中得到了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())
所以你做得比我想象的要好。你已经计算出最小部分了。但现在问题是:你是在使用双链接列表(明智的方法)还是单链接列表(有趣的方式)?你想给出一个理智的答案,还是一个有趣的答案?在
abarnert提到的困难在于,为了找到最小值,您必须遍历整个列表并跟踪值,但是为了从那里开始收集值,您需要跟踪节点本身,否则,当您到达列表末尾时,你会知道最小值是多少,但你没有办法回到那里!这里有几个选项。一个是,在通过时可以同时存储最小值和最小节点。另一种方法是只存储节点,并比较节点的值。在
现在,完成了这一步,您将有一个最小的节点开始。在
明智的选择:你有一个双重链接的列表。每个节点都有一个指向下一个节点的
next_node
,还有一个指向前一个节点的previous_node
。往回走很容易,我觉得不需要太多的解释。在有趣的选择:您有一个单链表。你一定要向前走!但没关系,如果你稍微改变一下。当找到最小值时,不是找到最小值节点,而是在它之前找到它;我们称之为A。现在开始重新排列列表。首先在A后面加上节点的值,然后再加上A的值。现在向前移动two。在之后添加节点的值,然后添加该节点。等等。。。这样的话,你就不必再向后移动了。在
在写这篇文章时,我没有注意到你的例子末尾的97,49。你也需要绕圈子吗?在这两种情况下也可以这样做。您只需将最后一个节点的next_节点设置为最小查找部分之后的第一个节点,然后在重新排序时,检查以确保您没有完全恢复。在
因此,我尝试着使用以下相当紧凑的代码来工作(我使用},而不是{}):
nn
而不是next_node
和{相关问题 更多 >
编程相关推荐