双向链表在现实生活中的使用

Posted

技术标签:

【中文标题】双向链表在现实生活中的使用【英文标题】:Real life use of doubly linked list 【发布时间】:2017-04-01 09:32:39 【问题描述】:

什么时候使用双向链表似乎是现实生活场景中的最佳选择?有人可以建议实际使用它吗?

【问题讨论】:

【参考方案1】:

添加到 templatetypedef 的答案。

您考虑以下应用:

- A music player which has next and prev buttons.
- Represent a deck of cards in a game.
- The browser cache which allows you to hit the BACK-FORWARD pages.
- Applications that have a Most Recently Used list (a linked list of file names)
- Undo-Redo functionality

您想从特定点遍历两侧的任何应用程序。

【讨论】:

【参考方案2】:

在许多操作系统中,线程调度程序(选择在什么时间需要运行哪些进程的东西)维护一个随时运行的所有进程的双向链表。这使得将进程从一个队列(例如,需要轮流运行的活动进程列表)移动到另一个队列(例如,被阻塞并等待释放它们的进程列表)变得容易。这里使用双向链表允许这些拼接和重新布线中的每一个在 O(1) 时间内运行并且没有任何内存分配,并且双向链表结构非常适合使用队列实现调度程序(您只需要从前面拉东西。)

【讨论】:

【参考方案3】:

双向链表用于构建MRU/LRU(最近最不使用)缓存。您可以在链接https://www.geeksforgeeks.org/design-a-data-structure-for-lru-cache/中找到使用 HashMap 和 DoublyLinkedList 的实现

LRU 缓存的主要应用之一是它用于使用最近访问次数最多/最少的项目的情况,例如在 android 手机主屏幕的情况下保存最近使用的应用程序。这是一个解释应用程序的链接

http://www.primarydigit.com/blog/an-application-of-lru-least-recently-used-data-structure-your-phones-home-screen

希望这会有所帮助!

【讨论】:

【参考方案4】:

你可以通过算法来思考。就像,假设你想存储一些数据,你必须在其中插入一些元素。最好的数据结构是链表,因为它在 O(1) 中完成任务。 接下来,假设您想从数据中访问某些元素。数组将是最好的,因为它需要 O(1) 来访问一个元素。但它会在 O(n) 中插入。

现在,在链表中,我们可以维护所有节点的映射,因此这将使访问事物在 O(1) 中。插入的东西已经在 O(1) 中。 现在剩下的是删除部分。在数组中,删除是在 O(n) 中完成的,在链表中也是在 O(n) 中完成的(如果你只有要删除的元素)。

但是,在链表中,如果我们有前一个节点的地址,那么我们可以在 O(1) 中删除所需的节点。这里就用到了双向链表。

上述数据结构在系统中完成了三个最重要的事情,即插入、删除和访问元素 O(1)。

【讨论】:

以上是关于双向链表在现实生活中的使用的主要内容,如果未能解决你的问题,请参考以下文章

带头节点的双向链表

liteos双向链表

数据结构带头双向循环链表

静态链表循环链表双向链表

js实现双向链表, 双向链表需要增加一个previous属性

数据结构之带头结点的循环双向链表详细图片+文字讲解