2015-05-04 99 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