数据结构JAVA单链表_java node list单链表-程序员宅基地

技术标签: java  Powered by 金山文档  数据结构  

实现单链表的基本结构:

  1. 创建空链表

与C语言不同在节点是通过对象创建的而不是结构体

  1. 添加数据至链尾

  1. 根据序号排序插入

通过循环比较节点序号大小将其插入相应位置

  1. 删除节点

  1. 修改节点内容

  1. 查找倒数第n个节点

  1. 链表显示

输出链表所有节点内容信息

  1. 查找链表中有效节点个数

  1. 链表反转

(1)通过创建新链表

通过循环原链表,将每一次循环到的第一个节点将其插入新链表头节点后面

(2)通过栈方式实现

通过栈的先进后出特点反向输出节点


话不多说上代码,看代码会清楚很多(一定要自己多运行~)


import java.util.Scanner;
import java.util.Stack;

public class SingleList {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        //初始化链表数据
        pNode node1 = new pNode(1, "小明", "数学天才");
        pNode node2 = new pNode(5, "李华", "英语幽灵");
        pNode node3 = new pNode(4, "小红", "数学辅助");
        pNode node4 = new pNode(3, "珍妮", "绿恐龙");
        pNode node5 = new pNode(2, "周树人", "鲁迅");
        pNode node6 = new pNode(7, "唐僧", "长生不老肉");

        //修改某节点内容
        pNode changenode=new pNode(4,"孙悟空","弼马温");

        //创建链表
        Slist slist = new Slist();
        //插入多个节点
        slist.orderAdd(node1);
        slist.orderAdd(node2);
        slist.orderAdd(node3);
        slist.orderAdd(node4);
        slist.orderAdd(node5);
        slist.orderAdd(node6);
        System.out.println("链表输出:");
        slist.showData();
        //修改和删除
        slist.uodata(changenode);
        slist.delete(node1);
        System.out.println("修改4和删除1后:");
        slist.showData();
        //输出有效节点个数
        System.out.printf("有效节点个数为:%d\n",slist.valid());
        //查找倒数第n个节点
        System.out.println("倒数第3个节点内容为:"+slist.backn(3));
        //反转链表
        System.out.println("反转链表结果为:");
        slist.reverse();
        slist.showData();
        //通过栈方式反转链表
        System.out.println("通过栈方式反转链表:");
        slist.stackway();
    }
}


//单链表对象
//管理节点和方法
class Slist{
    //初始化链表(只有一个头节点)
    private pNode head=new pNode(0,"","");

    //返回头节点
    public pNode getHead() {
        return head;
    }

    //判断链表是否为空
    public boolean isEmpty(){
        return head.next==null;
    }

    //添加节点
    public void addData(pNode node){
        //创建辅助节点
        pNode temp=head;
        //添加在链表末尾
        while (true){
            if(temp.next==null)break;
            temp=temp.next;
        }
        temp.next=node;
    }

    //按序号排名添加
    public void orderAdd(pNode p){
        pNode temp=head;
        if(isEmpty()){
//            System.out.println("链表为空,将新节点直接加入末尾");
            temp.next=p;
            return;
        }
        while (temp.next!=null){
            if (temp.next.info>p.info){
//                System.out.printf("找到p要插入的位置啦!在%d和%d之间插入%d\n",temp.info,temp.next.info,p.info);
                break;
            }
            temp=temp.next;
        }
        p.next=temp.next;
        temp.next=p;
    }


    //修改节点内容
    public void uodata(pNode p){
        pNode temp=head.next;
        if(isEmpty()){
            System.out.println("链表为空无法进行修改!");
            return;
        }
        while (true){
            if(temp.info==p.info){
//                System.out.printf("找到要修改值为%d的节点了\n",temp.info);
                break;
            }
            if(temp.next==null){
                System.out.println("没找到要修改的节点");
                return;
            }
            temp=temp.next;
        }
        temp.name=p.name;
        temp.nickname=p.nickname;
//        System.out.println("修改成功!");
    }

    //删除节点
    public void delete(pNode p){
        pNode temp=head;
        if(isEmpty()){
            System.out.println("链表为空无法删除!");
            return;
        }
        while (true){
            if(temp.next.info==p.info){
//                System.out.println("找到要删除的节点了!");
                break;
            }
            temp=temp.next;
        }
        temp.next=p.next;
//        System.out.println("删除成功!");
    }

    //查找链表中的有效节点个数(去掉头节点)
    public int valid(){
        pNode temp=head;
        int length=0;
        if(isEmpty()){
            System.out.println("链表为空!");
            return 0;
        }
        while (temp.next!=null){
            length++;
            temp=temp.next;
        }
        return length;
    }

    //查找倒数第n个节点
    public pNode backn(int n){
        pNode temp=head.next;
        pNode p;
        if(isEmpty()){
            System.out.println("链表为空,无法查找第n个节点");
            return null;
        }
        int len=valid()-n;
        for(int i=0;i<len;i++){
            if(temp.next==null){
                System.out.println("没找到倒数第n个节点");
                break;
            }
            temp=temp.next;
        }
        p=temp;
        return p;
    }




    //显示链表所有数据
    public void showData(){
        if(isEmpty()){
            System.out.println("链表是空哒,请先填写");
            return;
        }
        pNode temp=head.next;
        while (true){
            if(temp==null)break;
            System.out.println(temp);
            temp=temp.next;
        }

    }


    private pNode newnode=new pNode(0,"","");
    //链表反转(创建一个新的链表)
    public void reverse(){
        pNode temp=head.next;
        pNode p=null;
        if(isEmpty()){
            System.out.println("链表为空无法进行反转");
            return;
        }
        while (temp!=null){
            p=temp.next;
            temp.next=newnode.next;
            newnode.next=temp;
            temp=p;
        }
        head.next=newnode.next;

    }

    //链表反转(利用栈倒着输出(先进后出))
    public void stackway(){
        if(head.next==null){
            System.out.println("链表为空无法使用栈结构输出");
            return;
        }
        Stack<pNode> stack = new Stack<pNode>();
        pNode temp=head.next;
        //入栈
        while (temp!=null){
            stack.push(temp);
            temp=temp.next;
        }
        //出栈
        while (stack.size()>0){
            System.out.println(stack.pop());
        }
    }




}


//节点对象
class pNode{
        public int info;
        public String name;
        public String nickname;
        public pNode next;



    public pNode(int info, String name, String nickname){
            this.info=info;
            this.name=name;
            this.nickname=nickname;
        }

        @Override
    public String toString() {
        return "pNode{" +
                "info=" + info +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }

}

运行结果展示:

链表输出:

pNode{info=1, name='小明', nickname='数学天才'}

pNode{info=2, name='周树人', nickname='鲁迅'}

pNode{info=3, name='珍妮', nickname='绿恐龙'}

pNode{info=4, name='小红', nickname='数学辅助'}

pNode{info=5, name='李华', nickname='英语幽灵'}

pNode{info=7, name='唐僧', nickname='长生不老肉'}

修改4和删除1后:

pNode{info=2, name='周树人', nickname='鲁迅'}

pNode{info=3, name='珍妮', nickname='绿恐龙'}

pNode{info=4, name='孙悟空', nickname='弼马温'}

pNode{info=5, name='李华', nickname='英语幽灵'}

pNode{info=7, name='唐僧', nickname='长生不老肉'}

有效节点个数为:5

倒数第3个节点内容为:pNode{info=4, name='孙悟空', nickname='弼马温'}

反转链表结果为:

pNode{info=7, name='唐僧', nickname='长生不老肉'}

pNode{info=5, name='李华', nickname='英语幽灵'}

pNode{info=4, name='孙悟空', nickname='弼马温'}

pNode{info=3, name='珍妮', nickname='绿恐龙'}

pNode{info=2, name='周树人', nickname='鲁迅'}

通过栈方式反转链表:

pNode{info=2, name='周树人', nickname='鲁迅'}

pNode{info=3, name='珍妮', nickname='绿恐龙'}

pNode{info=4, name='孙悟空', nickname='弼马温'}

pNode{info=5, name='李华', nickname='英语幽灵'}

pNode{info=7, name='唐僧', nickname='长生不老肉'}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_61936651/article/details/129318476

智能推荐

c++求矩阵的秩_对于向量和矩阵的理解-程序员宅基地

文章浏览阅读316次。学数值计算还有复变函数了喔,矩阵忘干净了。又看了一遍 蓝棕 的相关的讲解,总结一下。1.向量是什么?从初到末的箭头(物理角度,表示一种运动过程)有序的数字列表(计算机/数学角度)[1,2]加和数乘运算有意义的anything(抽象意义)12两种理解之间的关系就是线性代数的奥秘,即几何角度与数值角度。一个向量的坐标由一对数构成,可以理解为从原点到终点的箭头,描述运动过程。比如,规定好坐标平面的单位,..._求矩阵的秩c++

从事汽车电子软件开发需要什么技能?_汽车mcu开发怎么入门-程序员宅基地

文章浏览阅读6.6k次,点赞8次,收藏90次。​前不久有一个朋友想转去做汽车软件开发,问我需要学习什么内容。今天在这里做一个分享,希望可以帮到这位朋友以及以后想要从事汽车电子软件开发的朋友们。随着SDV(软件定义汽车)概念的提出, 大家都认识到了软件在汽车电子领域的重要性,各大汽车主机厂纷纷成立了软件研发中心并争夺软件开发人才。上汽集团在今年年初成立了上汽软件中心(后改名为零束),长城汽车成立了诺博、诺创、诺博,还有很多OEM也成立或者扩大了各自的软件研发中心,这里都不赘述了。总之,这对从事汽车软件开发的同僚们是很大的利好。2019年大家经历了汽车_汽车mcu开发怎么入门

数学建模灵敏性分析(一阶、二阶灵敏度)python代码+懒人专用版_计算一阶sobol敏感性指数 python-程序员宅基地

文章浏览阅读9.2k次,点赞21次,收藏207次。对于勉强看懂了灵敏度分析的同学来说,本文给出一个方便移植、修改的python程序,可以很方便地进行灵敏度分析。_计算一阶sobol敏感性指数 python

怎样HTML做图片画廊,42个jQuery图片画廊插件-程序员宅基地

文章浏览阅读732次。这里列出了使用jQuery构建的42个jQuery图像库、滑块、插件和教程:1. TN3 GalleryTN3 Gallery是一个完整的基于HTML的可定制的图像库,包含幻灯片、转换和多个相册选项。兼容所有现代桌面和移动浏览器。由jQuery提供。2. AD Gallery当我编写可编辑的选择插件时,我受到了自己的启发,所以我决定再写一个。这是一个与插件类似的图片库插件,比如Thickbox和L..._jthumb

flink 流式处理中如何集成mybatis框架_flink集成mybatis-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏6次。flink 中自身虽然实现了大量的connectors,如下图所示,也实现了jdbc的connector,可以通过jdbc 去操作数据库,但是flink-jdbc包中对数据库的操作是以ROW来操作并且对数据库事务的控制比较死板,有时候操作关系型数据库我们会非常怀念在java web应用开发中的非常优秀的mybatis框架,那么其实flink中是可以自己集成mybatis进来的。 我们这里以flink 1.9版本为例来进行集成。如下图为flink内部自带的flink-jdbc:创建一个fli._flink集成mybatis

SQL语言的数据类型_sql数据类型-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏21次。MySQL中的数据类型有很多,主要分为三类:1.数值类型;TINYINT 1byte (-128,127) (0,255) 小整数值SMALLINT 2bytes (-32768,32767) (0,65535) 大整数值MEDIUMINT 3bytes (-8388608,8388607) (0,16777215) 大整数值INT/INTEGER 4bytes (-2147483648, 2147483647) (0,4294967295) 大整数值BIGINT _sql数据类型

随便推点

MPICH下载安装-程序员宅基地

文章浏览阅读8.1k次,点赞14次,收藏53次。项目场景:MPICH环境搭建和配置以下是我个人的搭建过程中遇到的一些问题,仅作参考问题1 :不知道如何下载,或是下载哪一个版本。 mpich下载,官网下载地址:https://www.mpich.org/downloads/下载的指导如下在http点击右键,其他窗口打开,下载链接就打开了,此时安装包就开始下载了,压缩包的格式为tar.gz将下下载压缩包放到合适的目录,然后按照下面的指令解压tar -xzvf mpich-3.4.2.tar.gz创建安装目录,_mpich下载

车载智能终端TBOX_tboxshang c行驶速度-程序员宅基地

文章浏览阅读637次。终端设备是基于GSM/WCDMA/TD-LTE通讯方式的GPS定位移动终端,车载设备具有强大的车辆监控管理、新能源CAN总线数据采集等功能,可以满足不同用户的需求,同时具备汽车行驶记录功能扩展应用。_tboxshang c行驶速度

nvme固态必须uefi启动吗_【Ubuntu】UEFI安装Windows 10和Ubuntu 18.04双系统(深度爬坑)...-程序员宅基地

文章浏览阅读1k次。前言必须先安装windows。如果先装Ubuntu再装Windows。安装Windows时会覆盖 EFI分区已有的引导,那么Ubuntu的引导就丢了。而先装Windows再装Ubuntu,Ubuntu会在EFI分区追加引导内容,Windows引导不会丢。中间很尴尬,把电脑装的连UEFI BIOS都进不了了,逼不得已直接抠了主板上的纽扣电池,复位了一下主板。我最开始尝试的是ubuntu 18.04,..._nvme0是什么启动项

python中pos函数用法_Python基础之函数用法实例详解-程序员宅基地

文章浏览阅读4k次。本文以实例形式较为详细的讲述了Python函数的用法,对于初学Python的朋友有不错的借鉴价值。分享给大家供大家参考之用。具体分析如下:通常来说,Python的函数是由一个新的语句编写,即def,def是可执行的语句--函数并不存在,直到Python运行了def后才存在。函数是通过赋值传递的,参数通过赋值传递给函数def语句将创建一个函数对象并将其赋值给一个变量名,def语句的一般格式如下:de..._python中pos函数用法

Symbol的使用方法_symbol方法-程序员宅基地

文章浏览阅读3.4k次。SymbolSymbol的描述和写法ES6新增的方法 Object.getSymbol的描述和写法Symbol 是ES6新引入的一种基本数据类型 表示的是独一无二的值 他是js里面第六种基本数据类型​ 基本数据类型 : string number boolean undefined null​ typeof 的返回值 string number boolean undefined object functionSymbol函数生成的数据 是独一无二的 即便参数一样 那么表示的值也不一_symbol方法

无法从jinja2 引入 evalcontextfilter, Markup, escape_from jinja2 import markup, escape-程序员宅基地

文章浏览阅读4.3k次,点赞6次,收藏10次。1、问题描述:使用airtest 进行UI自动化测试,将python3.6 升级到python3.9。各种包安装完成后,运行脚本,报错:ImportError: cannot import name evalcontextfilter, Markup, escape from ‘jinja2‘无法从jinja2引入 evalcontextfilter, Markup, escape。2、解决办法查看了之前python3.6时的jinja2版本为3.0.3;升级到python3.9后,jinja2版本_from jinja2 import markup, escape