更新:非常感谢所有回复的人!!!这让我觉得在努力学习 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
,我们需要做以下事情:
- 创建一个新的
Link
对象插入到前面 (newLink
)。 - 让新创建的
Link
指向之前的第一个Link
对象作为它的.next
- 将
LinkList
的.first
引用重置为newLink
对象,有效地覆盖了先前的引用(下面用叉号标记)。
这正是正在发生的事情:
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/