IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Day553&554&555.单链表 -数据结构和算法Java -> 正文阅读

[数据结构与算法]Day553&554&555.单链表 -数据结构和算法Java

单链表

一、链表介绍

在这里插入图片描述

二、单链表介绍

在这里插入图片描述

三、单链表应用实例

1、插入数据,插入单链表尾部案例

package com.achang.linkedlist;

/**
 * @Author Achang
 * @Date 2022/3/8 21:26
 * 单链表
 **/
public class SingleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode node1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode node2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode node3 = new HeroNode(3, "吴用", "智多星");
        HeroNode node4 = new HeroNode(4, "林冲", "豹子头");

        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.add(node1);
        singleLinkedList.add(node2);
        singleLinkedList.add(node3);
        singleLinkedList.add(node4);

        singleLinkedList.list();
    }
}

class SingleLinkedList{
    //初始化有节点,不存放具体的数据
    private HeroNode head = new HeroNode(0,"","");
    public void add(HeroNode node){
        HeroNode temp = head;
        while (true){
            //找到链表最后
            if (temp.next == null){
                break;
            }else {
                temp = temp.next;
            }
        }
        temp.next = node;
    }
    
    public void list(){
        if (head.next == null){
            System.out.println("链表为空");
            return;
        }
        HeroNode temp = head.next;
        while (true){
            //判断是否是链表的最后
            if (temp==null){
                break;
            }
            //输出节点信息
            System.out.println(temp);
            //next后移
            temp = temp.next;
        }
    }
}

class HeroNode{
    public int no;
    public String name;
    public String nickName;
    public HeroNode next;

    @Override
    public String toString() {
        return "no="+no+",name="+name+",nickName="+nickName;
    }

    public HeroNode(int no, String name, String nickName){
        this.name=name;
        this.nickName = nickName;
        this.no = no;
    }
}

在这里插入图片描述

二、根据Node序号,插入指定链表位置案例

如果存在就添加失败,并给出提示

class SingleLinkedList{
    //初始化有节点,不存放具体的数据
    private HeroNode head = new HeroNode(0,"","");

    //第二种添加方式,根据排名插入到指定位置(如果存在就添加失败,并给出提示)
    public void addByNo(HeroNode node){
        //因为头节点不能动,因为我们使用辅助指针,来帮助找到添加的位置
        HeroNode temp = this.head;
        boolean flag = false;//标志添加的编号是否存在,默认为false
        while (true){
            //说明在链表的最后
            if (temp.next==null){
                break;
            }
            //位置找到,就在temp的后面插入
            if (temp.next.no > node.no){
                break;
            }
            //说明需要添加的编号已经存在
            if (temp.next.no== node.no){
                flag = true;//说明编号存在
                break;
            }
            temp = temp.next;//后移,遍历当前链表
        }
        //判断是否需要添加
        if (flag){//说明编号存在,不能添加
            System.out.println("准备的插入的Node的No序号已经存在,不能在添加");
        }else {
            //插入到链表中,temp的后面
            node.next = temp.next;
            temp.next = node;
        }
    }


    public void list(){
        if (head.next == null){
            System.out.println("链表为空");
            return;
        }
        HeroNode temp = head.next;
        while (true){
            //判断是否是链表的最后
            if (temp==null){
                break;
            }
            //输出节点信息
            System.out.println(temp);
            //next后移
            temp = temp.next;
        }
    }
}

class HeroNode{
    public int no;
    public String name;
    public String nickName;
    public HeroNode next;

    @Override
    public String toString() {
        return "no="+no+",name="+name+",nickName="+nickName;
    }

    public HeroNode(int no, String name, String nickName){
        this.name=name;
        this.nickName = nickName;
        this.no = no;
    }
}

    public static void main(String[] args) {
        HeroNode node1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode node2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode node3 = new HeroNode(3, "吴用", "智多星");
        HeroNode node4 = new HeroNode(4, "林冲", "豹子头");

        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.addByNo(node1);
        singleLinkedList.addByNo(node3);
        singleLinkedList.addByNo(node2);
        singleLinkedList.addByNo(node4);

        singleLinkedList.list();
    }

三、单向链表的修改

编号不变,名字和昵称可变


    //修改节点,根据编号修改,编号不可变
    public void update(HeroNode node){
        //当前链表为空
        if (head.next==null){
            System.out.println("当前链表为空");
            return;
        }

        HeroNode temp = head;
        boolean flag = false;//表示是否找到该节点
        while (true){
            if (temp == null){
                break;//到了链表的最后
            }
            //找到了
            if (temp.no == node.no){
                flag = true;
                break;
            }
            temp = temp.next;//后移,遍历链表
        }
        if (flag){
            temp.nickName = node.nickName;
            temp.name = node.name;
        }else {
            System.out.println("未找到节点");
        }
    }

四、删除节点

在这里插入图片描述

    //删除节点
    //根据no序号,来删除节点
    public void deleteNode(int no){
        HeroNode temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null){
                System.out.println("已经到链表的最后");
                break;
            }
            if (temp.next.no ==no){
                System.out.println("找到了待删除的前一个节点");
                flag = true;
            }
            temp = temp.next;
        }
        if (flag){
            temp.next = temp.next.next;
        }else {
            System.out.println("要删除的节点不存在");
        }
    }

五、获取链表中有效节点个数

    //获取到单链表节点的个数,有头节点就不统计头节点
    public static int getLength(HeroNode head){
        if (head.next == null){
            return 0;
        }
        int length = 0;
        HeroNode temp = head.next;//不算头节点
        while (temp != null){
            length++;
            temp = temp.next;//后移遍历
        }
        return length;
    }

六、查找单链表中倒数第k个节点

在这里插入图片描述

    //查找单链表中倒数第k个节点
    public static HeroNode findLastIndexNode(HeroNode head, int index) {
        if (head.next == null) {
            return null;
        }
        int size = getLength(head);
        if (index <= 0 || index > size) {
            return null;
        }
        HeroNode temp = head.next;
        for (int i=0;i<size-index;i++){
            temp = temp.next;
        }
        return temp;
    }

七、单链表的反转

在这里插入图片描述

    //反转链表
    public void reverse(HeroNode head){
        //当前链表为空,则无需反转
        if (head.next == null || head.next.next == null){
            return;
        }
        HeroNode temp = head.next;
        HeroNode next = null;//指向当前节点的下一个节点
        HeroNode reverseHead = new HeroNode(0,"","");

        while (temp != null){
            next = temp.next;
            temp.next = reverseHead.next;//将temp的下一个节点指向新链表的最前端
            reverseHead.next = temp;//将temp连接到新的链表上
            temp = next;
        }
        head.next = reverseHead.next;
    }

八、逆序打印链表

通过栈结构【先进后出】

    //逆序打印链表 通过栈结构【先进后出】
    public void reversePrint(HeroNode head){
        if (head.next == null){
            System.out.println("当前为空链表,无法打印");
            return;
        }
        Stack<HeroNode> stack = new Stack<>();
        HeroNode temp = head;
        while (temp != null){
            stack.push(temp.next);
            temp = temp.next;
        }
        while (stack.size()>0){
            System.out.println(stack.pop());//逆序弹出
        }
    }
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:50:47  更:2022-03-10 22:55:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:38:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码