java 链表_Java数据结构——单向链表

本文详细介绍了链表的基本概念,包括单向链表的定义、结构和实现方式,并提供了添加、删除、修改节点的具体算法及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表

定义:

  • 链表是以节点的形式链式存储
  • 每个节点包括data域与naxt域
    • data:存储数据
    • next:指向下一个节点
  • 链表分为单向链表域双向链表

单向链表

d9225532dd4a367126daace6b19f4fbf.png

如图是单向链表个原理图

单向链表的功能:

添加节点

思路

无序添加节点

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、付费专栏及课程。

余额充值