繁体   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