java链表的头插法和尾插法

链表是由值和地址组成,地址指向下一个值的地址,如下图所示

java链表的头插法和尾插法_第1张图片

我们先定义一个节点类Listnode,里面包含值和地址属性,再通过构造器传值为这个值在内存中申请一块区域。代码如下:

public class Listnode {
    //链表中一个节点的值属性
	public int value;
//链表中一个节点的指针域属性,指向下一个值的地址,因为下一块区域是Listnode类型的所以next也是Listnode类型
	public Listnode next;
//构造器,通过值传递给value赋值
	public Listnode(int n) {
		this.value=n;
	}
	
}

先创建一个链表类Linklist.

头插法的思路是定义一个头指针Listnode head=null,把第一个节点的地址通过值传递给它,再创建节点时,让这个新节点的next指针指向旧节点,再让这个头指针指向新节点。如下图:

 java链表的头插法和尾插法_第2张图片

 java链表的头插法和尾插法_第3张图片

java链表的头插法和尾插法_第4张图片

头插法看如下代码:

public void startAdd(int n) {
//通过new实例给value创建一个新节点
		Listnode listnode=new Listnode(n);
//让新节点的下一个指向旧节点,因为旧节点通过值传递的方式传给head
		listnode.next=head;
//新节点通过值传递的方式传给head
		head=listnode;
	}

尾插法的思路是先定义一个游标temp,游标从头结点head开始,如果它的next指针域不是null,就让游标指向下一个,直到游标指向next指针域为null,然后在这个节点后插入新的节点。

java链表的头插法和尾插法_第5张图片

java链表的头插法和尾插法_第6张图片 java链表的头插法和尾插法_第7张图片

尾插法代码如下:

public void endAdd(int n) {
//通过new实例给value创建一个新节点
		Listnode listnode=new Listnode(n);
//判断头结点是否为空,空就通过值传递把新节点传给头节点,直接return不再走下面的流程
		if(head==null) {
			head=listnode;
			return;
		}
//定义游标
		Listnode temp=head;
//通过游标判断此节点的next指针域是否为空,不是就指向下一个节点
		while(temp.next!=null) {
			temp=temp.next;
		}
//此时指向最后一个节点,让它的next指针域指向新节点
		temp.next=listnode;
	}

总体代码如下:

public class Linklist {
//定义头指针
	Listnode head;
//头插法
	public void endAdd(int n) {
		Listnode listnode=new Listnode(n);
		if(head==null) {
			head=listnode;
			return;
		}
		Listnode temp=head;
		while(temp.next!=null) {
			temp=temp.next;
		}
		temp.next=listnode;
	}
//尾插法
	public void startAdd(int n) {
		Listnode listnode=new Listnode(n);
		listnode.next=head;
		head=listnode;
	}
//把添加的值打印的方法
	public void printLink() {
		Listnode temp=head;
		while(temp!=null) {
			System.out.print(temp.value+" ");
			temp=temp.next;
		}
	}
//获取添加多少数的方法
	public void getLength() {
		int count=0;
		if(head==null) {
			System.out.println(0);
			return;
		}
		Listnode temp=head;
		while(temp!=null) {
			count++;
			temp=temp.next;
		}
		System.out.println("你添加了"+count+"个数");
	}
}

通过test类来测试一下:

public class Test {
	public static void main(String[] args) {
		Linklist linklist=new Linklist();
		linklist.endAdd(1);
		linklist.endAdd(2);
		linklist.endAdd(3);
		linklist.endAdd(4);
		linklist.startAdd(2);
		linklist.startAdd(3);
		linklist.startAdd(4);
		linklist.printLink();
		linklist.getLength();
	}
}

结果如下:

 

你可能感兴趣的:(链表,java,数据结构)