首先代码如下:package com.dbstructor.oop2;
class Link {
public int iData;
public double dData;
public Link next;
public Link(int id, double dd){
iData = id;
dData = id;
}
public void displayLink(){
System.out.print("{" + iData + "," + dData + "}");
}
}
class LinkList {
private Link first;
public LinkList(){
first = null;
}
public boolean isEmpty(){
return (first == null);
}
// 插入链接点
public void insertFirst(int id, double dd){
Link newLink = new Link(id, dd);
newLink.next = first;
first = newLink;
}
// 删除链接点
public Link deleteFirst(){
Link temp = first;
first = first.next;
return temp;
}
public void displayList(){
System.out.print("List (first-->last): ");
Link current = first;
while(current != null){
current.displayLink();
current = current.next;
}
System.out.println("");
}
}public class LinkListApp { public static void main(String[] args) {
LinkList theList = new LinkList();
theList.insertFirst(22, 2.99);
theList.insertFirst(44, 4.99);
theList.insertFirst(66, 6.99);
theList.insertFirst(88, 8.99);
theList.displayList();
while(!theList.isEmpty()){
Link aLink = theList.deleteFirst();
System.out.print("Deleted ");
aLink.displayLink();
System.out.println("");
}
theList.displayList(); }}
class Link {
public int iData;
public double dData;
public Link next;
public Link(int id, double dd){
iData = id;
dData = id;
}
public void displayLink(){
System.out.print("{" + iData + "," + dData + "}");
}
}
class LinkList {
private Link first;
public LinkList(){
first = null;
}
public boolean isEmpty(){
return (first == null);
}
// 插入链接点
public void insertFirst(int id, double dd){
Link newLink = new Link(id, dd);
newLink.next = first;
first = newLink;
}
// 删除链接点
public Link deleteFirst(){
Link temp = first;
first = first.next;
return temp;
}
public void displayList(){
System.out.print("List (first-->last): ");
Link current = first;
while(current != null){
current.displayLink();
current = current.next;
}
System.out.println("");
}
}public class LinkListApp { public static void main(String[] args) {
LinkList theList = new LinkList();
theList.insertFirst(22, 2.99);
theList.insertFirst(44, 4.99);
theList.insertFirst(66, 6.99);
theList.insertFirst(88, 8.99);
theList.displayList();
while(!theList.isEmpty()){
Link aLink = theList.deleteFirst();
System.out.print("Deleted ");
aLink.displayLink();
System.out.println("");
}
theList.displayList(); }}
问题:大家帮助理解些链表,看了几遍一直没理解好:
主要的几点疑惑public Link next; 这个是在内存里怎么分配.
// 插入链接点
public void insertFirst(int id, double dd){
Link newLink = new Link(id, dd);
newLink.next = first;
first = newLink;
}
这个方法怎么和上面这个图片对应上去?
大家主要给我讲解一下
insertFirst和deleteFirst这两个方法
引用是怎么个具体指向(每一步代码)
然后怎么维护形成链表了 谢谢大家
public void insertFirst(int id, double dd){
Link newLink = new Link(id, dd);//这里是创建了一个新的链接点
newLink.next = first; // 第二步
first = newLink; // 第三步和第二步怎么跟图片不吻合的感觉...
}
Link newLink = new Link(id, dd)
然后 把这个新new节点所持有的引用指向原来的第一个节点:
newLink.next = first;
然后把first这个引用指向新new的节点
first = newLink;
就是这样的
它也是一个结点类型的。
当然我们也可以把它理解为整个链表的一个指针。
它标识了链表的存在。
在插入操作中:
因为都是在起始位置上作插入操作的。所以first总是会指向新的结点,当然要使新的结点插入到整个链表中还要做新的结点的next指向原来first的所指向的那个结点,
每插入一点新的结点都有这样的操作。这样链表就不断的增长。
Link temp = first;
first = first.next;
return temp;
直接把first指向第二次结点就可以了,也就是第一个结点所指向的下一个 first = first.next
这句话 到底是next指向了first的引用 还是first指向了next的引用呢?
Link newLink = new Link(id, dd); //新建一个结点.
newLink.next = first; //新建的结点的next指向first指向的结点。
first = newLink; //first指向新结点。 }
新的结点的next指向了first指向的内容。
第二步,新结点的next指向first指向的结点。
第三步,first指向新结点。
再有就是我#6的图
每一块叫一个链接点么? 还是其实的first和next叫链接点
1.用一个引用指(temp)向first指向的结点。
2.让first指向first指向的结点的next属性指向的结点。
3.返回temkp.
谢谢楼上的兄弟们.
LinkList theList = new LinkList();
theList.insertFirst(22, 2.99);
这个我这样理解大伙看对不对 对了就表示通了呵呵..首先LinkList theList = new LinkList();实例化对象即首链接点.并初始了Link类型的 first为Null
其次theList.insertFirst(22, 2.99);在这个方法里
(1)Link newLink = new Link(id, dd);也是新建一个newLink链接点,并初始化Link类型的next为Null
(2)newLink.next = first;将first指针地址覆盖next的,即next指向了first的引用
(3)first = newLink;将first指向了newLink的新引用
最终链结构就是first--->newLink(next)---->Null大伙指正下 准备结贴
回楼上的兄弟,我这个就是单链表 所以一个入口而已,以后会渐渐扩展的.所以会经常来问大家的
因为我是自学JAVA.谢谢大家.都很热心...