头插法: 头插法的实现相对简单 思路是将新形成的节点的下一个赋值为header
再把新形成的节点地址传给header即将header向前移动。
import java.util.Random;
import java.util.Scanner;
public class Link {
//创建一个存储数据的属性
int data;
//创建存储下一个节点地址的属性
Link next;
static int length=0;
/**
* 创建一个链表
* @param len 产生数据的长度
* @return 链表第一个节点地址
*/
public static Link creat(int len){
//定义随机对象
Random r=new Random();
//定义链表的节点
Link newnode,header;
//header永远存储第一个节点的地址,tailer永远存储最后一个节点的地址
header=null;
for (int i = 0; i < len; i++) {
//生成一个随机数字
int temp=r.nextInt(100);
//创建一个临时节点
newnode=new Link();
//长度
length++;
//为属性赋值
newnode.data=temp;
//判断当前链表是否第一次赋值
if(header==null){
header=newnode;
}else{
//将新节点连接到链表的头部
newnode.next=header;
//header永远存储第一个节点的地址
header=newnode;
}
}
return header;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("输入长度:");
int l=sc.nextInt();
System.out.println("打印数组:");
//调用数组生成方法 传入键盘值l
Link head=Link.creat(l);
for (int i = 0; i < Link.length; i++) {
System.out.print(head.data+" ");
//把当前对象的下一个对象地址传给当前对象
head=head.next;
}
}
}
尾插法:
工作原理:创建一个类MyLinked设置一个存储链表数据的属性int data,在设置存储链表内下一个数据节点的属性MyLinked next.
定义一个创建链表的方法,定义head永远保存第一个节点地址,storage永远保存最后一个地址,last保存每次循环产生的临时节点地址,创建数据给data,创建新地址给storage。next做拼接storage接受当前地址作为最后一个地址存储。
import java.util.Random;
public class MyLinked {
int data; //创建一个数组的属性
MyLinked next; //创建一个储存下一个节点的属性
public MyLinked ceate(int len) {
Random r = new Random();//随机对象
MyLinked head,storage,last; //定义三个对象,head 为 永远存储第一个节点的地址
//storage 为 永远存储最后一个节点的地址
//last 为 新的临时节点
head = storage = last = null;
for (int i = 0; i <len ; i++) {
int temp = r.nextInt(50);
last = new MyLinked();//创建一个新的临时节点
last.data = temp; //为属性赋值
if (head ==null){ //判断链表是否是第一次赋值
head = storage = last;
}else {
storage.next = last;//将新节点连接到链表的尾部
storage = last; //永远的储存最后一个节点的地址
}
}
return head;
}
public static void main(String[] args) {
MyLinked my = new MyLinked();//引用
MyLinked ww = my.ceate(10);//将随机的数值赋值给ww
for (int i = 0; i <10 ; i++) {
System.out.print(ww.data+" ");//打印第一个数的值;
ww = ww.next;//将下一个数my.next值赋给xx后,下一轮xx.data就相当于这个数的值;
}
}
}