假设非Null语言-如何实现链表



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

现在您想要实现一个链表。但是:

  • 您不能指向null来结束列表。

  • 如果你指向一个空对象来表示列表的末尾,它将用另一个空的对象初始化自己的指针。这种情况将无限期地持续下去,直到内存满为止。

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

一个解决方案可以使用与Maybe类型等效的东西。它要么具有值Just x(在本例中x是列表中的下一个节点),要么具有Nothing。也许monad在Haskell中得到了最好的展示。

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

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

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

希望这能有所帮助!

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新