栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

尚硅谷03 数据结构与算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

尚硅谷03 数据结构与算法

文章目录
  • 1. 链表介绍
  • 2. 应用场景
  • 3. 添加节点(分析)
  • 4. 插入查看(实现)
  • 5. 插入查看(测试)
  • 6. 有序添加、不允许重复
  • 7. 有序添加(测试)
  • 8. 修改(实现)
  • 9. 修改(测试)
  • 10. 删除
  • 完整代码


1. 链表介绍


链表的介绍:

  1. 以节点的方式存储。节点包含数据域和指针域,指针域指向下一个节点
  2. 可以有头结点、也可以没有头结点
    头结点的作用:
    ①使链表(包括空表)的头指针非空,就不用判断指针非空了
    ②插入、删除时,不需要判断列表是否非空
    ③插入、删除时,列表的第一个位置与其它位置的操作相同
  3. 节点的存储方式不一定是连续的

    列表在内存中的存储不一定是连续的

    上面是真实在内存中的存储情况(物理结构),下面是看起来的存储情况(逻辑结构)
2. 应用场景

一个节点用于存放一个个体信息,然后对个体信息进行操作(crud)

3. 添加节点(分析)
  1. 每次将新节点添加到单链表的尾部(尾插法)
4. 插入查看(实现)



定义一个类,类对象作为节点
属性:存放节点数据,数据域(个体信息)、指针域(类对象就是引用)
构造方法:带参
属性打印:

这里是单独定义了一个类,用来操作单链表
初始化头指针
添加节点
遍历节点

5. 插入查看(测试)

先创建多个节点对象
然后创建单链表对象后,再将节点对象加入到单链表

这里没有考虑编号,节点的次序是按添加的次序(无序)

6. 有序添加、不允许重复


在内存中就完成了排序,比在数据库中完成排序 效率要高
按序插入节点:

按序添加


7. 有序添加(测试)


8. 修改(实现)



9. 修改(测试)


10. 删除




完整代码
package com.SingleLinkedList03;

public class SingleLinkedListDemo {
    
    public static void main(String[] args) {
        HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode heroNode2 = new HeroNode(2, "晁盖", "玉麒麟");
        HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
        HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
        HeroNode heroNode5 = new HeroNode(2, "小晁", "玉麒麟~~~");// 编号no重复测试
        HeroNode heroNode6 = new HeroNode(5, "小宋", "及时雨~~~");// 修改测试

        SingleLinkedList singleLinkedList = new SingleLinkedList();

        singleLinkedList.addByOrder(heroNode4);
        singleLinkedList.addByOrder(heroNode2);
        singleLinkedList.addByOrder(heroNode3);
        singleLinkedList.addByOrder(heroNode5);
        singleLinkedList.addByOrder(heroNode1);
        singleLinkedList.update(heroNode6);
        System.out.println("删除前:");
        singleLinkedList.list();
        System.out.println("删除后:");
        singleLinkedList.del(1);
        singleLinkedList.del(4);
        singleLinkedList.del(2);
        singleLinkedList.del(3);
        singleLinkedList.del(6);
        singleLinkedList.list();
    }
}

class HeroNode{
    // 1. 创建节点类
    // 2. 添加属性(no,name,nickname,next)
    public int no;
    public String name;
    public String nickname;
    public HeroNode next;
    // 3. 添加构造方法(初始化属性)
    public HeroNode(int no, String name, String nickname) {
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }
    // 4. toString() 方法
    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + ''' +
                ", nickname='" + nickname + ''' +
                '}';
    }
}

class SingleLinkedList {
     // 5. 创建单链表类
     // 6. 初始化头节点对象
    private HeroNode head = new HeroNode(0, "", "");
     // 7. 插入方法
    public void add(HeroNode heroNode) {
        HeroNode temp = head;
        // 首先要找到最后一个节点
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = heroNode;
    }
     // 8. 查看方法
    public void list() {
        if (head.next == null) {
            System.out.println("链表为空~~~");
            return;
        }
        HeroNode temp = head;
        while (temp.next != null) {
            System.out.println(temp.next.toString());
            temp = temp.next;
        }
    }
     // 9. 有序插入方法
    public void addByOrder(HeroNode heroNode) {
        HeroNode temp = head;
        while (temp.next != null) {
            if (temp.next.no < heroNode.no) {
                temp = temp.next;
            }else if (temp.next.no > heroNode.no) {
                heroNode.next = temp.next;
                break;
            }else if (temp.next.no == heroNode.no) {
                System.out.printf("编号为 %d 的节点已经存在,添加失败!n", heroNode.no);
                return;
            }
        }
        temp.next = heroNode;
    }
     // 10. 修改方法
    public void update(HeroNode heroNode) {
        if (head.next == null) {
            System.out.println("链表为空,更新失败~~~");
            return;
        }
        HeroNode temp = head;
        while (temp.next != null) {
            temp = temp.next;
            if (temp.no == heroNode.no) {
                temp.name = heroNode.name;
                temp.nickname = heroNode.nickname;
                return;
            }
        }
        System.out.printf("没有找到编号为 %d 的节点,不能修改n", heroNode.no);
    }
     // 11. 删除方法
    public void del(int no) {
        HeroNode temp = head;
        while (temp.next != null) {
            if (temp.next.no == no) {
                temp.next = temp.next.next;
                return;
            }
            temp = temp.next;
        }
        System.out.printf("要删除节点 %d 不存在n", no);
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/972583.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号