【问题标题】:Why are Linked Lists Reversed? [closed]为什么链表是颠倒的? [关闭]
【发布时间】:2020-09-17 12:35:43
【问题描述】:

为什么要反转链接列表?

我一直在听很多软件工程师谈论反向链接列表。反转链表有什么用?这样做而不是倒退有什么好处?

  • 为什么在技术面试中使用它们?
  • 除了技术面试还有什么用?

【问题讨论】:

  • 我认为除了在软件开发人员面试中经常被问到的问题之外,没有特定的用例可以反转链表。

标签: algorithm sorting data-structures linked-list traversal


【解决方案1】:

据我所知,有链表和双链表。当您使用双链表时,每个节点都有一个指向下一个和前一个节点的指针,因此很容易向后遍历。当列表“仅链接”时,节点只有“下一个引用”,因此您将无法向后遍历。 我希望能正确回答问题

【讨论】:

  • 谢谢,但遗憾的是这并没有回答我的问题。换句话说,为什么要这样做以及在什么情况下使用它?
  • @RandomProgrammer 它确实部分回答了这个问题,并举例说明了为什么这样做:如果你想向后遍历(就像你在问题中提到的那样)但 不能 (因为它是一个单链表)。这种情况下,可以先反转再向前遍历,相当于不可能直接向后遍历。
【解决方案2】:

在现实生活中时不时会出现反转链表。

最近我在实现无锁多生产者单消费者工作队列时这样做了。栈是实现最简单的无锁数据结构,实现是一个单链表,所以我的多个生产者会将新工作推送到无锁栈上。

然后单个消费者可以一次获得整个堆栈,但随后必须反转它以按正确顺序创建任务队列。

也就是说……您可能问错了问题。反转链表的任务是您可以做的最简单的数据结构操作之一。如果您被教导这样做,那么这只是真正理解编程的漫长道路上的早期课程。如果你在面试中被问到这个问题,那么面试官想知道你是否可能是可以设计、实现和维护数据结构的程序员,或者你是否可以从 StackOverflow 复制和修改答案,然后把东西粘在一起你不明白。

【讨论】:

    【解决方案3】:

    反转作为递归函数结果的列表是很常见的。考虑一个map 函数

       fn map (fun, lst) =
            local fn mp (in, out) = 
                 if null(in)
                 then out
                 else mp(tail(in), fun(head(in)) :: out)
            return reverse(mp(lst, nil))
    

    它反转内部函数的结果,将结果顺序恢复为输入列表的顺序。

    如果您的语言支持突变,则有更有效的方法可以做到这一点,即保留指向列表中最后一对的指针,并在每次调用内部函数时附加一对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 2017-03-20
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多