今天的数据结构课,我学习了数据结构中_线性表的链式存储和实现这一内容.
首先参考书上代码,建立一个节点类.
节点类
public class Node <T>{
public T data;
public Node<T> next;
public Node(T data, Node<T> next) {
super();
this.data = data;
this.next = next;
}
public Node(T data) {
super();
this.data = data;
this.next=null;
}
public Node() {
}
}
然后老师要求我们将随机的字母存进去.
main方法
import java.util.Random;
public static void main(String[] args) {
Random rand=new Random();
char a=(char)('a'+rand.nextInt(26);
Node<String>noL=new Node<String>(a+"");
Node<String>head=noL;
for(int i=1;i<10;i++) {
c=(char)('a'+rand.nextInt(26));
Node<String>noM=new Node<String>(c+"");
noL.next=noM;
noL=noM;
}
noL.next=null;
noL=head;
while(noL!=null) {
System.out.print(noL.data+" ");
noL=noL.next;
}
}
通过导入Random来使用随机数,通过Node泛型来建立一个String类型的noL来存入随机数,head存的是头地址也就是noL的指针位置.(这不是C语言…) 接着通过for循环建立新的一个节点.
循环的意思很简单,就是让每一个前驱和后驱变换,建立了后驱并且前驱的地址链接上后驱后,前驱就转变成后驱,(只是名字改变,物理性质未改变),然后再建立后驱.
很快我就把代码抄好了
老师看了看大家接着又给我们说:"既然大家都会做了,我们就进个阶."然后老师就让我们先想一想如何在这10个链表节点中插入一个新的节点,又在链表中删除某一个节点.我翻了翻书,书本的代码很灵活,简略了很多,我表示不太行,简单的有没有?
老师说:"大家都看懂了一些吧?怎么理解大家都不懂的,毕竟这书是给学霸看的."接着老师就开始解释这两个方法的简单的原理,并且提示:用循环做最简单的方式.
插入
也就是找到你想要添加的位置的前一个节点,然后建立个新的节点,把找到的哪个节点的地址(noL.next=new)获取新的节点地址.但在此之前,新的节点的next就要获取之前哪个节点的next.(new.next=noL.next;)
Node<String>new=new Node<String>("我是你要想要插入的字符串");
new.next=noL.next;
noL.next=new;
接下来就又人问了:老师老师,那我怎么循环到我想要插入的位置的前一个呢?
“你用那种循环来做呢?”
“for循环最好用啦!”
for(int i=1;i<5;i++){
????????
}
那么我要怎么写呢?
于是我就想了想,既然我循环就以及在遍历了,那么我i<5可能在就是插入第五个位置,哪之前就应该是完好的,那就是类似移动下标咯,noL=noL.next;
于是我测试了一下:
Random rand=new Random();
char c=(char)('a'+rand.nextInt(26));//[0~25]
Node<String>noL=new Node<String>(c+"");
Node<String>head=noL;
for(int i=1;i<10;i++) {
c=(char)('a'+rand.nextInt(26));
Node<String>noM=new Node<String>(c+"");
noL.next=noM;
noL=noM;
}
noL=head;
for(int i=1;i<4;i++) {
noL=noL.next;
}
Node<String>noM=new Node<String>("?");//插入
noM.next=noL.next;
noL.next=noM;
noL=head;
while(noL!=null) {
System.out.print(noL.data+" ");
noL=noL.next;
}
还真可以,这就莫名其妙的写出来了!
接下来就删除某一个位置了,我在想既然这个循环就可以让我到达某位置来删除,那么我继续用它来找到我需要删除的某个数也是可以的嘛.
也就在寻思中莫名其妙的我就把代码写好了.
删除的思路也就是如我画的图所示:
将某一个节点所要表达的下一个节点的地址直接跳过一个节点来获取.
由于没用对比于是我就输出了原链表和删除后的链表:
//衔接建立链表的代码
System.out.println();
noL=head;
for(int i=1;i<1;i++) {
noL=noL.next;
}
noL.next=noL.next.next;//删除
noL=head;
while(noL!=null) {
System.out.print(noL.data+" ");
noL=noL.next;
}
也因为又换行所以才很显而易见的输出
(其实三个都可以一起输出的)