【发布时间】:2020-09-17 12:35:43
【问题描述】:
为什么要反转链接列表?
我一直在听很多软件工程师谈论反向链接列表。反转链表有什么用?这样做而不是倒退有什么好处?
- 为什么在技术面试中使用它们?
- 除了技术面试还有什么用?
【问题讨论】:
-
我认为除了在软件开发人员面试中经常被问到的问题之外,没有特定的用例可以反转链表。
标签: algorithm sorting data-structures linked-list traversal
为什么要反转链接列表?
我一直在听很多软件工程师谈论反向链接列表。反转链表有什么用?这样做而不是倒退有什么好处?
【问题讨论】:
标签: algorithm sorting data-structures linked-list traversal
据我所知,有链表和双链表。当您使用双链表时,每个节点都有一个指向下一个和前一个节点的指针,因此很容易向后遍历。当列表“仅链接”时,节点只有“下一个引用”,因此您将无法向后遍历。 我希望能正确回答问题
【讨论】:
在现实生活中时不时会出现反转链表。
最近我在实现无锁多生产者单消费者工作队列时这样做了。栈是实现最简单的无锁数据结构,实现是一个单链表,所以我的多个生产者会将新工作推送到无锁栈上。
然后单个消费者可以一次获得整个堆栈,但随后必须反转它以按正确顺序创建任务队列。
也就是说……您可能问错了问题。反转链表的任务是您可以做的最简单的数据结构操作之一。如果您被教导这样做,那么这只是真正理解编程的漫长道路上的早期课程。如果你在面试中被问到这个问题,那么面试官想知道你是否可能是可以设计、实现和维护数据结构的程序员,或者你是否可以从 StackOverflow 复制和修改答案,然后把东西粘在一起你不明白。
【讨论】:
反转作为递归函数结果的列表是很常见的。考虑一个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))
它反转内部函数的结果,将结果顺序恢复为输入列表的顺序。
如果您的语言支持突变,则有更有效的方法可以做到这一点,即保留指向列表中最后一对的指针,并在每次调用内部函数时附加一对。
【讨论】: