【问题标题】:How are linked lists implemented without the use of pointer?不使用指针如何实现链表?
【发布时间】:2012-08-24 18:53:55
【问题描述】:

在有指针的 C++ 中很容易实现链表。但是它们是如何用其他语言(如 java、python 等)实现的。我不想使用内置类(在 JAVA 中支持)作为链表,但我想要的是如何替换指针来创建链表?

【问题讨论】:

  • 阅读本文,看看它是否足以解决您的问题:stackoverflow.com/questions/7480783/pointers-in-java
  • @asawyer 在 Python 和 Java 中没有任何内容通过引用传递。在许多其他使用相同含义的引用的语言中都没有。
  • @asawyer:同意德尔南。 Java 是按值传递的。总是。该值可能是一个引用,但传递的是一个值。
  • @asawyer 我还没学过Java曾经 ;)
  • @DirkHolsople 他们不是。所有值(可变的不可变的——停止区分人)都是引用类型,但参数传递永远不会传递参考(编辑:令人困惑的错字)。两者都是具有非常具体和独特含义的技术术语。另见stackoverflow.com/a/986145/395760

标签: java c++


【解决方案1】:

它们是使用引用来实现的,这些引用本质上是(不包括语法)指针,您不能使用这些指针进行指针运算(在某些语言中它们也不能为空)。在许多语言中,引用是使用变量的默认方式,这与 C++ 的默认方式是按值不同。

【讨论】:

  • +1 我喜欢这种对引用的解释。它是如此快速、简单和准确,除了对 C 语言的老手来说显而易见并且让其他人有理由学习这方面的编程。
【解决方案2】:

对于其他语言,您处理与指针密切相关的引用。

【讨论】:

    【解决方案3】:

    如前所述,使用引用而不是指向内存块的指针。所以就像你在 C++ 中所做的那样

    Struct Node {
      Node *last;
      Node *next;
    }
    

    看起来像这样:

    Struct Node {
      Node last;
      Node next;
      }
    

    【讨论】:

    • 最后一句很不幸。如果我们将其视为面值,即“Node 是值类型”,则意味着您对Node 的第二个定义无效,因为它是无限大小的。引用确实不是地址,但它们间接引用。
    • 我刚刚注意到你的第二个例子是无效的,即使忽略了现在删除的解释。 (如果它应该是 C++ 的话。)
    • 它只是被认为是伪代码的可视化。 Struct 刚刚来自他的 C++ 背景
    【解决方案4】:

    一个好的数据结构类会告诉你一个链表可以用任何使用数组的语言来实现,比如 FORTRAN。

    您可以使用其他方法来定位下一个链接,而不是使用指针。使用数组,而不是指针,您将使用下一个元素的索引。

    因此,您可以通过使用文件位置而不是指针来在随机访问文件中实现链表。

    【讨论】:

    • 我不确定这是否算作链表。它肯定与基于指针的实现有不同的特点,因为它更受限制。除此之外,这完全无关紧要,因为您可以使用引用构建“常规”链接列表(以及所有其他依赖于间接的数据结构)。
    • 它是一个列表,它是链接的。它不使用指针来链接节点。它是链表的不同实现。我在大学的数据结构课上学到了这一点。
    【解决方案5】:

    当您编写自己的类时,比如说class node,并让每个node 为下一个node 持有一个字段,您实际上持有对下一个节点的引用(如果它是最后一个节点,则为 null)

    【讨论】:

      【解决方案6】:

      你可能会在这本书中找到一个很好的答案 - http://www.amazon.com/Introduction-Algorithms-Thomas-H-Cormen/dp/0262033844 - 我会为你总结一下我记得的。

      基本上,您将拥有两个大小相等的数组(希望大于 n,其中 n=您要存储的元素数)。我们称它们为 Array A 和 Array B。

      数组 A[i] 保存数据值。数组 B[i] 保存 'next' 值 'k' 使得 A[i]->next = A[k]。

      希望这会有所帮助。

      【讨论】:

      • 查看我对 Thomas Matthew 回答的评论。
      【解决方案7】:

      记住链表的概念是你可以从一个元素到另一个元素。你的做法可能会非常不同。

      例如,在 C++ 中,您提到可以使用指针。也就是说,另一种方式是使用对象的内存地址。

      但这只是一种方式。如果您的所有对象都是从数组中引用的,那么您将能够通过它在该数组上的索引来引用一个对象。所以你的链表中的每个元素都会有一个整数来指定它所连接的对象的索引。

      再举一个例子。如果您有一个字典,其中将对象与字符串相关联。然后你可以使用字符串来相互引用。

      链表的核心概念不是指针,而是链表中的元素负责跟踪它所连接的元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-09
        • 2013-10-29
        • 2011-03-01
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多