数据结构之单链表

1、思想(理解)

在这里插入图片描述

增、删、查 、改思路

  • (增)直接添加放到最后即可。按顺序添加:找到要修改的节点的前一个节点,插入新节点()。
  • (改)要修改的节点修改内容即可。
  • (删)找到待删除节点的前一个节点,把要删除节点的后一个节点信息存放到该节点的next即可
  • (查==较容易)遍历依次打印即可。按编号查找,找到对应编号打印即可

2、代码

package basicdata;

public class SingleLinkedListTest {
    public static void main(String[] args) {
        Node node1 = new Node(123, "Tom", "无极剑道");
        //

        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.addNode(node1);
        singleLinkedList.list();
        System.out.println("*******************");
        singleLinkedList.addByOrder(new Node(234, "Jack", "断头斩杀"));
        singleLinkedList.addByOrder(new Node(121, "Jack", "断头斩杀"));
        singleLinkedList.addByOrder(new Node(121, "Jack", "断头斩杀"));
        singleLinkedList.list();
        //System.out.println("******修改后*******");
        //singleLinkedList.alter(new Node(121, "Bob", "无形之刃"));
        //singleLinkedList.list();
       // System.out.println("**************");
        //singleLinkedList.delNode(234);

        System.out.println("***反转后***");
        singleLinkedList.reverSetList();
        singleLinkedList.list();

    }
}
//
class SingleLinkedList{
    // 先初始化一个头结点,头节点不存放数据
    private Node head = new Node(0,"表头","领导单链表");

    // 返回表头
    public Node getHead(){
        return head;
    }

    public SingleLinkedList() {
    }

    // 添加节点到单链表,按添加顺序排列
    public void addNode(Node node){

        // 思路:把头结点的地址给temp
        //      直到next = null时,让next存放添加的节点

        Node temp = head;
        while (true){
            if (temp.next == null) {
                break;
            }
            else {
                temp = temp.next;

            }
        }
        // 退出while 循环时 temp.next = null
        temp.next  = node;
    }

    // 遍历单链表
    public void list(){
        Node temp = head;
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        while (true){
            if (temp == null) {
                break;
            }
            else {
                // 输出节点信息
                System.out.println(temp);
                // 指针后移
                temp = temp.next;
            }
        }
    }

    //  根据编号顺序插入节点 ,链表内容按编号从小到大排列
    public void addByOrder(Node node){
        // 需要先找到要添加位置的前一个节点

        // 链表为空不需要单独考虑
        Node temp = head;
        // 为找到插入位置 需要一个 flag
        boolean flag = false;
        while (true){
            // 此情况可以添加,添加到表头后
            if (temp.next == null) { // 到链表末端
                break;
            }
            // 此情况不可以添加,要添加的编号已经存在
            if (temp.next.number == node.number) {
                flag = true;
                break;
            }
            //此情况为找到要添加位置的前一个节点,可以添加
            if (temp.next.number > node.number) {
                break;
            }
            else {
                temp = temp.next;
            }
        }

        if (flag ) {
            System.out.printf("你要插入的节编号%d已经存在",node.number);
            System.out.println();
        }
        else {
            node.next = temp.next ;
            temp.next=node;
        }
    }
    // 修改节点信息(根据编号),编号不变,修改内容
    public void alter(Node node){
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }

        // 和按编号插入(Node temp = head;)稍微有点区别
        // Node temp  = head.next;
        Node temp  = head.next;
        boolean flag = false;
         while (true){
             if (temp == null) {
                 break;
             }
             // 找到要修改的节点,可以修改
             if (temp.number == node.number) {
                 flag = true;
                 break;
             }
             else {
                 temp = temp.next;
             }
         }
        if (flag) {
            // 修改
            temp.name = node.name;
            temp.skill= node.skill;
        }
        else {
            System.out.println("没有找到要修改的节点");
        }

    }
    // 根据编号删除节点
    public void delNode(int number){
        //需要找到待删除的前一个节点
        Node temp = head;
        boolean flag = false;
        while (true){
            if (temp.next == null) {
                break;
            }
            //找到待删除的前一个节点
            if (temp.next.number == number) {
                flag = true;
                break;
            }
            else {
                temp  =  temp.next;
            }

        }
        if (flag ) {
            //
            temp.next = temp.next.next;
        }
        else {
            System.out.println("要删除的元素不存在");
        }
    }

    // 反转单链表
    public void reverSetList(){
        if (this.head.next== null||this.head.next.next==null) {
            return;
        }

        Node tempCur = this.head.next; // 辅助变量
        Node tempNext = null;      // 指向tempCur,不然会丢失
        Node reverSetHead = new Node(0, "", ""); // 新链表
        while (tempCur != null){
            tempNext = tempCur.next; //存储当前节点的下一节点
            tempCur.next = reverSetHead.next;// 头插法 把当前节点接到到reverSetHead
            reverSetHead.next = tempNext;
            tempCur=tempNext;// 后移
        }
        this.head.next = reverSetHead.next;
    }

}
// 定义Node
class Node{
    public int number;
    public String name;
    public String skill;
    public Node next;    //存放下一个节点地址
//构造器
    public Node(int number, String name, String skill) {
        this.number = number;
        this.name = name;
        this.skill = skill;

        //this.next = next;
        // 理解:不给next赋值
        //没申请一个节点时 next = null
    }
    //重写 toString
    @Override
    public String toString() {
        return "Node{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

运行结果

Node{number=0, name='表头', skill='领导单链表'}
Node{number=123, name='Tom', skill='无极剑道'}
*******************
你要插入的节编号121已经存在
Node{number=0, name='表头', skill='领导单链表'}
Node{number=121, name='Jack', skill='断头斩杀'}
Node{number=123, name='Tom', skill='无极剑道'}
Node{number=234, name='Jack', skill='断头斩杀'}
******修改后*******
Node{number=0, name='表头', skill='领导单链表'}
Node{number=121, name='Bob', skill='无形之刃'}
Node{number=123, name='Tom', skill='无极剑道'}
Node{number=234, name='Jack', skill='断头斩杀'}
删除后**************
Node{number=0, name='表头', skill='领导单链表'}
Node{number=121, name='Bob', skill='无形之刃'}
Node{number=123, name='Tom', skill='无极剑道'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值