python链表前后移动

2024-09-30 10:36:38 发布

您现在位置:Python中文网/ 问答频道 /正文

如何重新排列列表,使其从最小元素的第一次出现开始,并重复地向后移动一步,向前移动三步? 我只能找到最小的元素(例如,我在下面的测试中得到了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())

Tags: selfnonenode元素列表returnifinit
1条回答
网友
1楼 · 发布于 2024-09-30 10:36:38

所以你做得比我想象的要好。你已经计算出最小部分了。但现在问题是:你是在使用双链接列表(明智的方法)还是单链接列表(有趣的方式)?你想给出一个理智的答案,还是一个有趣的答案?在

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

现在,完成了这一步,您将有一个最小的节点开始。在

明智的选择:你有一个双重链接的列表。每个节点都有一个指向下一个节点的next_node,还有一个指向前一个节点的previous_node。往回走很容易,我觉得不需要太多的解释。在

有趣的选择:您有一个单链表。你一定要向前走!但没关系,如果你稍微改变一下。当找到最小值时,不是找到最小值节点,而是在它之前找到它;我们称之为A。现在开始重新排列列表。首先在A后面加上节点的值,然后再加上A的值。现在向前移动two。在之后添加节点的值,然后添加该节点。等等。。。这样的话,你就不必再向后移动了。在


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


因此,我尝试着使用以下相当紧凑的代码来工作(我使用nn而不是next_node和{},而不是{}):

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

相关问题 更多 >

    热门问题