python Linked List向后移动并向前移动

时间:2015-05-04 10:21:49

标签: python linked-list

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

1 个答案:

答案 0 :(得分:1)

所以你做得比我假设​​的好your fellow student。你有最低限度的部分。但现在问题是:你是使用双向链表(理智的方式)还是单链表(有趣的方式)?你想给出一个理智的答案,还是一个有趣的答案?

提到的难点是,为了找到最小值,您必须浏览整个列表并跟踪,但是按顺序然后从那里开始收集值,你需要跟踪节点本身,因为否则,当你到达列表的末尾时,你会知道最小值是什么,但你无法回到那里!这里有一些选择。一个是你可以在经历时存储最小值和最小节点。另一个是你可以只存储节点,并比较节点的值。

现在,完成后,您将拥有最小的节点。

理智的选择:您有一个双重链接列表。每个节点都有一个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