【问题标题】:Implementation of linked list in JavaJava中链表的实现
【发布时间】:2014-04-11 07:51:07
【问题描述】:

在一次采访中,我被要求在 Java 中实现一些链表方法。我只有在 C++ 中实现链表的经验,有些事情让我很担心。在阅读了this question 并看到了答案后,我仍然有顾虑。

class Link {
    public int data1;
    public double data2;
    public Link nextLink;

    //Link constructor
    public Link(int d1, double d2) {
        data1 = d1;
        data2 = d2;
    }

    //Print Link data
    public void printLink() {
        System.out.print("{" + data1 + ", " + data2 + "} ");
    }
}

我的第一个问题是 Java 没有指针。我习惯于看到类似Node* nextNode; 而不是public Link nextLink; 的东西。如何在没有指针的情况下为 Link 赋值?是因为在 Java 中 new 返回一个实际的 Link 对象吗?或者它是否返回对它的引用?如果它返回对它的引用,这不是问题,因为引用不同于实际的Link 对象?或者在 Java 中任何对象的标识符实际上是一个引用?

我知道这是一个见仁见智的问题,但为什么链表似乎更多地出现在 C++ 中?我猜这种语言没有内置支持,所以很多关于链表的教程都是面向 C++ 的(即使重点是数据结构)。

【问题讨论】:

  • 在Java中任何对象的标识符实际上是一个引用?我认为这就是解决方案。
  • 对长段中的最后一句是。在 Java 中,任何对象的标识符都是一个引用。
  • Java 对象引用实际上是指针,具有查找对象所需的值。即地址
  • 您知道Java 中的对象引用是一个指针,或者为什么我们在访问空引用时会得到NullPointerException :-)
  • Java 中的所有对象类型都是引用类型。引用通常使用指针来实现,但并非必须如此。这能说明问题吗?

标签: java c++ data-structures linked-list


【解决方案1】:

这是因为 java 使用它们的引用来操作对象。众所周知,java是传值的,但是对象的值是它们的地址。

【讨论】:

  • 所以在 C++ 中,如果你只有 Node nextNode; 而不是 Node* nextNode,一切都会效率低下,因为传递的是副本,而不是指针?
  • 关于那个:有没有办法解决这个问题?我可以在哪里做类似 foo(bar a){ a = new bar()} 的事情,并且 a 也在 bar 的范围之外更改?因为根本无法做到这一点似乎是一个巨大的痛苦,我觉得必须有某种方法可以做到这一点
  • @Celeritas- 我不太记得 C++ 中的情况,但我认为您的答案是 here
  • @user2520938> 这是什么意思:“a 在 bar 的范围之外也发生了变化”?你的意思是foo
  • @Celeritas 找到解决没有指针的 Java 的最佳方法可能是查看您最喜欢的 Java 版本:完整参考系列。我的是第八版,而这里是 Herbert Schildt 的第九版链接:Java The Complete Reference 9/E [Paperback]。第八版的第 59 页和第 113 页比较了 C/C++ 指向 Java 引用的指针(与声明分配给在该对象上调用 Java new 的结果的 Java 实例不同)。
【解决方案2】:

Java 有它自己的 LinkedList 类,如果那是你所要求的

在这里查看:

http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html

【讨论】:

  • 还记得标准库std::list 容器。
  • 不,看起来问题根本不是在问这个问题。
【解决方案3】:

在 java 中,对象是通过它们的引用来操作的,引用类似于 C++ 中的指针,只是你不能像在 C++ 中那样直接操作地址。

在 java 中,当您使用 Object 时,您会使用它的引用,因此代码中的 Link 只是对列表中下一个 Node 对象的引用。

【讨论】:

    【解决方案4】:

    java中的对象引用和指针一样好,明显的区别是你不能在这里做指针运算。 MyClass myRef;in java 仅表示将指向某个对象的引用。 当您执行MyClass myRef = new MyClass(); 一个对象并创建它并且它的引用存储在myRef 中时。您应该意识到内存中的对象和它们在 myRef 中的引用之间的区别。这与我们在 C/C++ 中所做的几乎相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多