簡體   English   中英

python鏈表后退並前進

[英]python Linked List move backwards and move forward

如何對列表進行重新排序,使其從第一次出現的最小元素開始,並反復向后移動一個步驟,並向前移動三個步驟? 我只能找到最小的元素(例如,在下面的測試中我得到了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的值放在上面。現在向前移動2 添加節點的值之后 ,然后添加節點。 依此類推...這樣,您實際上不必向后移動。


在撰寫本文時,我沒有注意到示例末尾的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM