java - 理解链表实现的问题

标签 java data-structures linked-list

更新:非常感谢所有回复的人!!!这让我觉得在努力学习 Java 的过程中我并不孤单。请原谅,但我想我没有充分说明我对链表和练习应用程序不了解的地方 -

首先 - 类定义如何包含其自身的对象,好的,我知道这是递归,但它对我来说仍然是一个非常奇怪和陌生的概念。

其次 - 链表对象究竟如何“链接”到另一个节点?

第三 - 如果两个对象用等号分隔,这意味着什么 - 第二个对象消失了,剩下的是它现在指向第一个对象的“名称”,反之亦然?

然后 - 关于我在下面引用的程序,我不明白的是:在 linkList 类被实例化后,它的构造函数被调用,它首先为 Link private Link 类的对象提供值null,即将其设置为不指向任何内容。然后,当第一个新节点被创建时,方法 public void insertFirst 被调用,它将对象值赋给它的变量,然后一些荒谬的事情发生了——第一个没有指向任何东西的对象被分配给新项目,从而使两个对象都指向什么都没有,第一个= newLink;我完全迷路了……

我正在上一门关于算法和数据结构的大学类(class),由于教授真的很刻薄而且他的解释毫无用处,我正在尝试从 Robert Lafore 的一本名为算法和数据结构的书中自学。

现在我正在学习链表,书中有以下链表实现的代码示例:

链接.java:

class Link
   {
   public int iData;              // data item
   public double dData;           // data item
   public Link next;              // next link in list

   public Link(int id, double dd) { // constructor
      iData = id;                 // initialize data
      dData = dd;                 // ('next' is automatically
      }                           //  set to null)

   public void displayLink() {     // display ourself
      System.out.print("{" + iData + ", " + dData + "} ");
      }
   }

链表.java:

class LinkList {
   private Link first;            // ref to first link on list

   public LinkList() {             // constructor
      first = null;               // no links on list yet
      }

   public boolean isEmpty() {      // true if list is empty
      return (first==null);
      }
                                  // insert at start of list
   public void insertFirst(int id, double dd) { // make new link
      Link newLink = new Link(id, dd);
      newLink.next = first;       // newLink --> old first
      first = newLink;            // first --> newLink
      }

   public Link deleteFirst() {     // delete first item
      // (assumes list not empty)
      Link temp = first;          // save reference to link
      first = first.next;         // delete it: first-->old next
      return temp;                // return deleted link
      }

   public void displayList() {
      System.out.print("List (first-->last): ");
      Link current = first;       // start at beginning of list
      while(current != null)      // until end of list,
         {
         current.displayLink();   // print data
         current = current.next;  // move to next link
         }
      System.out.println("");
      }
   }

LinkListApp.java:

class LinkListApp {
   public static void main(String[] args) {
      LinkList theList = new LinkList();  // make new list

      theList.insertFirst(22, 2.99);      // insert four items
      theList.insertFirst(44, 4.99);
      theList.insertFirst(66, 6.99);
      theList.insertFirst(88, 8.99);

      theList.displayList();              // display list

      while( !theList.isEmpty() ) {        // until it's empty,
         Link aLink = theList.deleteFirst();   // delete link
         System.out.print("Deleted ");         // display it
         aLink.displayLink();
         System.out.println("");
         }
      theList.displayList();              // display list
      }
   }

我只是无法理解在链表类中插入和显示项目的代码。

怎么可能newLink.next = first; and first = newLink; 在创建新对象之后?

请帮忙!

最佳答案

每个 Link 都包含对下一个 Link 元素的引用 .next(最后一个元素除外,.next = null

LinkList 持有对其包含的第一个 Link 对象的引用 (.first)。

为了在LinkList 的前面插入一个新的Link,我们需要做以下事情:

  1. 创建一个新的 Link 对象插入到前面 (newLink)。
  2. 让新创建的Link指向之前的第一个Link对象作为它的.next
  3. LinkList.first 引用重置为 newLink 对象,有效地覆盖了先前的引用(下面用叉号标记)。

Source: See cacoo.com/diagrams/SRZoHdJ4GEn5PKAF

这正是正在发生的事情:

public void insertFirst(int id, double dd) {
    Link newLink = new Link(id, dd);
    newLink.next = first;
    first = newLink;
}

关于java - 理解链表实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9516884/

相关文章:

java - 存储数据表的最佳方式

.net - 使用字典时 .NET 4 并发性能差

math - 基于2-3-4树结构的优先级队列

C编程,双向链表复制问题

java - 如何在喜欢列表中任意插入节点?

java - 如何通过保留顺序来删除链表中的重复项

java - JDBC 连接太多

java - RestTemplate 无法填充对象

java - dlmread 为大型文本文件返回单列

c - 使用 fwrite 将结构体指针写入文件