java链表的头插法和尾插法

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

我们先定义一个节点类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指针指向旧节点,再让这个头指针指向新节点。如下图:

 

 

头插法看如下代码:

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,然后在这个节点后插入新的节点。

 

尾插法代码如下:

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();
	}
}

结果如下:

 

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sshm_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值