![](/img/trans.png)
[英]openGL move forward with rotation works for 0 degrees, backwards for 90 degrees
[英]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.