单向链表 java_Java数据结构——单向链表

链表

定义:链表是以节点的形式链式存储

每个节点包括data域与naxt域data:存储数据

next:指向下一个节点

链表分为单向链表域双向链表

单向链表

如图是单向链表个原理图

单向链表的功能:

添加节点

思路

无序添加节点

1、先创建一个头节点(head),作用为了表示单链表的头部

2、后面每添加一个节点,遍历一次链表加到链表最后

3、注意:遍历链表的时候用辅助指针(temp)替换(head),因为头节点不能轻易改变

有序添加节点

1、先获取要添加节点的编号(num)

2、遍历链表num > temp.num的时候添加,如果num存在就不添加

删除节点

思路

1、找到要删除的节点(temp)

2、保存要删除的节点的前一个节点(pre)

3、保存要删除节点的后一个节点(temp.next)

4、让前一个节点的next指向后一个节点 :pre.next = temp.next

修改节点

思路

1、遍历链表先找到需要修改的节点

2、然后通过temp指针获取这个节点的信息再修改

代码实现

public class Chain {

public static void main(String[] args) {

SingleChain sc = new SingleChain();

HeroNode h1 = new HeroNode(1,"刘备");

HeroNode h2 = new HeroNode(2,"关羽");

HeroNode h3 = new HeroNode(3,"张飞");

HeroNode h4 = new HeroNode(4,"孔明");

// sc.addHeroDisorder(h1);

// sc.addHeroDisorder(h2);

// sc.addHeroDisorder(h3);

// sc.addHeroDisorder(h4);

sc.addHeroOrder(h1);

sc.addHeroOrder(h3);

sc.addHeroOrder(h2);

sc.addHeroOrder(h4);

sc.update(4,"赵云");

sc.delete(3);

sc.show();

}

}

class SingleChain{

//申明头节点

private HeroNode head = new HeroNode(0,"");

//无序添加节点

public void addHeroDisorder(HeroNode heroNode){

//因为当前的head节点不能动,所以我们需要一个辅助遍历temp

HeroNode temp = head;

//遍历链表找到最后一位

while (true){

if (temp.next==null){

break;

}

//把指针向后移动一位不然是死循环

temp = temp.next;

}

temp.next = heroNode ;

}

//无序添加节点

public void addHeroOrder(HeroNode heroNode){

HeroNode temp = head ;

boolean flag = false;

while (true){

if (temp.next==null){

break;

}

if (temp.next.num > heroNode.num){

break;

}else if (temp.next.num==heroNode.num){

flag = true;

break;

}

temp = temp.next;

}

if (flag){

System.out.println("改编号已经存在");

}else {

heroNode.next = temp.next;

temp.next = heroNode;

}

}

//修该队列信息

public void update(int num,String name){

if (head.next==null){

System.out.println("队列为空");

return;

}

HeroNode temp = head;

while (true){

if (temp.next==null){

break;

}

if (temp.next.num==num){

temp.next.name = name;

}

temp = temp.next;

}

}

//删除节点

public void delete(int num){

//保存要删除的节点的前一个节点

HeroNode pre = null;

HeroNode temp = head.next;

boolean flag = false ;//判断是否找到这个节点

while (true){

if (temp == null){

System.out.println("已到达链表最后");

break;

}

if (temp.num == num){

flag = true;

break;

}

pre = temp ;//保存上一个子节点信息

temp = temp.next;

}

if (flag){

pre.next = temp.next;

}else{

System.out.println("没找到编号为"+num+"的节点");

}

}

//打印队列

public void show(){

if (head.next==null){

System.out.println("该队列为空!");

return;

}

HeroNode temp = head.next;

while (true){

if (temp == null){

break;

}

System.out.println(temp);

temp = temp.next;

}

}

}

class HeroNode{

//当前节点的编号

public int num ;

//当前节点的姓名

public String name ;

//指针域:指向下一个节点

public HeroNode next ;

//构造方法

public HeroNode(int num,String name){

this.name = name;

this.num = num ;

}

//重写toString方法

@Override

public String toString() {

return "HeroNode{" +

"num=" + num +

", name='" + name + '\'' +

'}';

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值