【问题标题】:python Linked List move backwards and move forwardpython Linked List 向后移动和向前移动
【发布时间】:2015-05-04 10:21:49
【问题描述】:

如何对列表重新排序,使其从第一次出现的最小元素开始,然后反复向后移动一步,然后向前移动三步? 我只能找到最小的元素(例如,我在下面的测试中得到了 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 我不太确定 min 节点和 min 值有什么区别,也许我需要 value 并将 value 放入列表中?
  • 所以我想问一下:你和this person是同一个班的,还让我们帮你做作业?
  • @cge 我不太确定,可能有同样的问题,只是混淆了后退和前进,因为尝试了几次。

标签: python linked-list


【解决方案1】:

所以你做得比我想象的要好your fellow student。你已经完成了最小的部分。但是现在的问题是:您使用的是双向链表(理智的方式)还是单链表(有趣的方式)?你想给出一个理智的答案,还是一个有趣的答案?

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

现在,完成此操作后,您将拥有开始的最小节点。

明智的选择:你有一个双向链表。每个节点都有一个指向下一个节点的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

【讨论】:

  • 是的,我需要。因为我想保留此列表中的所有元素。
  • 像这样用一个和两个字母的名字替换好名字会混淆代码,让新手更难弄清楚你在做什么。她在弄清楚抽象方面有足够的挑战;没有理由将这些挑战隐藏在无关紧要的挑战之下……
  • 该解释旨在以一种有帮助的方式教授抽象和方法。即使她没有直接复制它,使用特定的、可用的代码作为回应也只是在为她做功课。我放了代码来展示它可以使用我描述的方法来完成,并且作为我自己的紧凑性练习,而不是让它直接有用;这些名称不是最容易混淆的部分。如果有什么明确的名字会使荒谬更清楚。不过,当时我很累,也许没有思考;如果它会更好,我会很好地删除代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多