有另一位程序员提到在他的职业生涯中没有发现过使用链表数据结构的实际应用场景。我也无法立即想出任何好的例子。他主要是C#和Java开发人员。
有没有人可以给出一些例子,说明这是解决特定实际问题的正确数据结构?
相关链接:链表的实际应用需要什么样的场景?
有另一位程序员提到在他的职业生涯中没有发现过使用链表数据结构的实际应用场景。我也无法立即想出任何好的例子。他主要是C#和Java开发人员。
有没有人可以给出一些例子,说明这是解决特定实际问题的正确数据结构?
相关链接:链表的实际应用需要什么样的场景?
链表相对于静态或动态扩展数组等可比较的数据结构具有以下几个优势:
当这些优点在程序中具有显著的价值(且链表的缺点可以忽略不计)时,就应当使用链表。
对于游戏开发来说,侵入式链表是一种有趣的数据结构。例如,通常会使用一种侵入式单向或双向“渲染”列表:
class Renderable /* 或者 class Object,随意 */ { // ... Renderable * m_pNext; Renderable * m_pPrev; // 如果是单向链表则不需要 // ... }
当Renderable对象被创建或销毁时,它们可以在不引起任何内存分配的情况下向该列表注册自己。如果它们的渲染深度或优先级发生变化,它们可以将自己从列表中移除并重新插入。
当需要进行渲染时,你只需要找到列表的头部并快速遍历整个列表,调用相应的方法即可!
当然,这个主题有很多变化,比如使用多个独立的列表等等。而且你不需要使用侵入式链表来实现这个功能,我只是觉得侵入式链表很有趣。
单向链表的一些例子。
双向链表的一些例子。
栈和队列是链表的明显例子,但是其他人已经提到了它们,我想再举几个例子:
DOM将节点存储为链表。以下是一个简单的JavaScript示例,实际上任何语言都一样:
for (var node = parent.firstChild; node != null; node = node.nextSibling) {
// ..
}
在任何一个对象具有指向同类型另一个对象的属性时,异常都可能发生。在CLR中,由于InnerException
属性,异常形成了一个链接列表。
不可变的链表是一种非常有价值的数据结构,因为可以与具有相同尾部的其他链表“共享结构”。大多数函数式编程语言都包括不可变的链表类型作为其基本数据结构之一,并且这些类型广泛应用于各个领域。