2015-05-04 59 views
0

如何对列表重新排序,使其从第一次出现的最小元素开始,然后以三步向后一步向后移动? 我只能找到最小的元素(例如,我在下面的测试中得到5)?那么我怎样才能得到清单(5,53,65,33,51,62,61,38,74,45,97,49)呢?python链接列表向后移动并向前移动

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

嗯,首先,你”如果你想能够从该节点向后移动一步,就必须跟踪min_node_,而不仅仅是min_value_。 – abarnert

+0

其次,您可能需要使用双向链接列表,而且这看起来是单链接的。奇怪的是,具体的要求意味着有一种方法可以非常有效地使用单链表来完成此操作,但这可能不是您想要的,并且需要一些聪明才智。 – cge

+0

@abarnert我不太清楚最小节点和最小值有什么区别,也许我需要价值并将值放在列表中? –

回答

0

所以你比我想象的要好的是your fellow student。你有最小的部分解决。但现在问题在于:您是使用双向链表(理性的方式来做到这一点)还是使用单链表(有趣的方式)?你想给一个理智的答案,或一个有趣的答案?

困难abarnert被提的是,为了找到最小值,你必须要经过整个列表和跟踪的,但为了再从那里聚会开始值,您需要跟踪节点本身,否则,当您到达列表末尾时,您会知道最小值是多少,但您无法再回到那里!这里有几个选项。一个是你可以在经过时存储最小值和最小值节点。另一个是你可以只存储节点,并比较节点的值。

现在,做完这些之后,您将拥有从最低节点开始。

理智的选择:你有一个双向链表。每个节点有一个指向下一个节点的next_node,以及指向前一个节点的previous_node。往回走很容易,我不认为它需要很多解释。

有趣的选择:你有一个单独的链接列表。你必须始终前进!但是,如果你做一些细微的改变,那没问题。找到最小值时,不是找到最小节点,而是找到它之前的节点;让我们称之为A.现在开始制作重新排列的清单。首先在A之后放置节点的值,然后放入A的值。现在向前移动两个。在之后添加节点的值,然后添加该节点。等等......这样你就不必往后退。


在写这篇文章时,我没有注意到在你的例子结尾处的97,49。你需要循环吗?这也可以在两种情况下完成。您可以将最后一个节点的next_node设置为最小查找部分之后的第一个节点,然后在重新排序时检查并确保您没有完全恢复。


所以玩这个的时候,我设法得到下面的相当紧凑的代码工作(我用nn,而不是next_nodev代替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 
+0

是的,我需要。因为我想保留这个列表中的所有元素。 –

+0

谢谢。我会尝试。 –

+0

用这样的单字母和双字母替换好名称会使代码混淆,并使新手难以弄清楚自己在做什么。她有足够的挑战来搞清楚抽象;没有理由在不相关的挑战下隐藏这些挑战...... – abarnert