假设的非空语言 - 链接列表将如何实现?

时间:2015-03-05 15:59:20

标签: null linked-list language-agnostic programming-languages non-nullable

假设您正在使用null根本不存在的编程语言编写。它要么使用空对象,要么抛出ObjectNonexistentException或类似的东西。

现在您要实现链接列表。但是:

  • 您无法指向null结束列表。

  • 如果指向一个空对象来表示列表的结尾,它将使用另一个空对象初始化自己的指针。这将无限期地继续,直到内存已满。

你怎么去的?在不使用任何形式的null的情况下,假设的编程语言必须支持哪些功能才能使链表成为可能?

3 个答案:

答案 0 :(得分:2)

一种解决方案可能是使用与Maybe类型相同的东西。它具有值Just x,其中x在这种情况下是列表中的下一个节点,或者Nothing。 Maybe monad最好在Haskell中演示。

http://learnyouahaskell.com/a-fistful-of-monads

答案 1 :(得分:2)

您可以使用的一种方法是引入一个虚拟单元格,其下一个指针指向自身。那个虚拟单元,我们可以称之为Nil,不需要任何空指针。然后,每个链接列表都可以使用指向Nil的指针而不是指向null的指针来表示列表结束。

您的问题似乎表明这不起作用,因为在创建Nil单元格时,下一个指针将默认指向一个新单元格,这将无限制地指向新单元格。我不确定这必然是真的,因为你可以想象编程语言会给你一些初始化指针的方法,而不是自动为它创建一个新对象。

希望这有帮助!

答案 2 :(得分:2)

一种解决方案是将列表末尾对象指向自身。当然,这需要语言来支持这种能力,但这样的事情并不罕见。

如果语言具有面向对象的功能,那么您可以定义一个抽象类型或接口用作列表项,其实现可以指向列表中的下一个项目,也可以不指向。

abstract class ListItem {}
class ListItemNormal : ListItem { ListItem next; }
class ListItemEnd : ListItem { }

某些语言具有从属类型,其中一个字段的值可以确定是否存在另一个字段。在这种情况下,可以使用单独的布尔变量模拟空值。