数据结构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

智能推荐

海康威视网络摄像头开发流程(五)------- 直播页面测试_ezuikit 测试的url-程序员宅基地

文章浏览阅读3.8k次。1、将下载好的萤石js插件,添加到SoringBoot项目中。位置可参考下图所示。(容易出错的地方,在将js插件在html页面引入时,发生路径错误的问题)所以如果对页面中引入js的路径不清楚,可参考下图所示存放路径。2、将ezuikit.js引入到demo-live.html中。(可直接将如下代码复制到你创建的html页面中)<!DOCTYPE html><html lan..._ezuikit 测试的url

如何确定组态王与多动能RTU的通信方式_组态王ua-程序员宅基地

文章浏览阅读322次。第二步,在弹出的对话框选择,设备驱动—>PLC—>莫迪康—>ModbusRTU—>COM,根据配置软件选择的协议选期期,这里以此为例,然后点击“下一步”。第四步,把使用虚拟串口打勾(GPRS设备),根据需要选择要生成虚拟口,这里以选择KVCOM1为例,然后点击“下一步”设备ID即Modbus地址(1-255) 使用DTU时,为下485接口上的设备地址。第六步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“第五步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“_组态王ua

npm超详细安装(包括配置环境变量)!!!npm安装教程(node.js安装教程)_npm安装配置-程序员宅基地

文章浏览阅读9.4k次,点赞22次,收藏19次。安装npm相当于安装node.js,Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js依赖的包进行管理,也可以理解为用来安装/卸载Node.js需要装的东西_npm安装配置

火车头采集器AI伪原创【php源码】-程序员宅基地

文章浏览阅读748次,点赞21次,收藏26次。大家好,小编来为大家解答以下问题,python基础训练100题,python入门100例题,现在让我们一起来看看吧!宝子们还在新手村练级的时候,不单要吸入基础知识,夯实自己的理论基础,还要去实际操作练练手啊!由于文章篇幅限制,不可能将100道题全部呈现在此除了这些,下面还有我整理好的基础入门学习资料,视频和讲解文案都很齐全,用来入门绝对靠谱,需要的自提。保证100%免费这不,贴心的我爆肝给大家整理了这份今天给大家分享100道Python练习题。大家一定要给我三连啊~

Linux Ubuntu 安装 Sublime Text (无法使用 wget 命令,使用安装包下载)_ubuntu 安装sumlime text打不开-程序员宅基地

文章浏览阅读1k次。 为了在 Linux ( Ubuntu) 上安装sublime,一般大家都会选择常见的教程或是 sublime 官网教程,然而在国内这种方法可能失效。为此,需要用安装包安装。以下就是使用官网安装包安装的教程。打开 sublime 官网后,点击右上角 download, 或是直接访问点击打开链接,即可看到各个平台上的安装包。选择 Linux 64 位版并下载。下载后,打开终端,进入安装..._ubuntu 安装sumlime text打不开

CrossOver for Mac 2024无需安装 Windows 即可以在 Mac 上运行游戏 Mac运行exe程序和游戏 CrossOver虚拟机 crossover运行免安装游戏包-程序员宅基地

文章浏览阅读563次,点赞13次,收藏6次。CrossOver24是一款类虚拟机软件,专为macOS和Linux用户设计。它的核心技术是Wine,这是一种在Linux和macOS等非Windows操作系统上运行Windows应用程序的开源软件。通过CrossOver24,用户可以在不购买Windows授权或使用传统虚拟机的情况下,直接在Mac或Linux系统上运行Windows软件和游戏。该软件还提供了丰富的功能,如自动配置、无缝集成和实时传输等,以实现高效的跨平台操作体验。

随便推点

一个用聊天的方式让ChatGPT写的线程安全的环形List_为什么gpt一写list就卡-程序员宅基地

文章浏览阅读1.7k次。一个用聊天的方式让ChatGPT帮我写的线程安全的环形List_为什么gpt一写list就卡

Tomcat自带的设置编码Filter-程序员宅基地

文章浏览阅读336次。我们在前面的文章里曾写过Web应用中乱码产生的原因和处理方式,旧文回顾:深度揭秘乱码问题背后的原因及解决方式其中我们提到可以通过Filter的方式来设置请求和响应的encoding,来解..._filterconfig selectencoding

javascript中encodeURI和decodeURI方法使用介绍_js encodeur decodeurl-程序员宅基地

文章浏览阅读651次。转自:http://www.jb51.net/article/36480.htmencodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误,所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字符还原回来_js encodeur decodeurl

Android开发——打包apk遇到The destination folder does not exist or is not writeable-程序员宅基地

文章浏览阅读1.9w次,点赞6次,收藏3次。前言在日常的Android开发当中,我们肯定要打包apk。但是今天我打包的时候遇到一个很奇怪的问题Android The destination folder does not exist or is not writeable,大意是目标文件夹不存在或不可写。出现问题的原因以及解决办法上面有说报错的中文大意是:目标文件夹不存在或不可写。其实问题就在我们的打包界面当中图中标红的Desti..._the destination folder does not exist or is not writeable

Eclipse配置高大上环境-程序员宅基地

文章浏览阅读94次。一、配置代码编辑区的样式 <1>打开Eclipse,Help —> Install NewSoftware,界面如下: <2>点击add...,按下图所示操作: name:随意填写,Location:http://eclipse-color-th..._ecplise高大上设置

Linux安装MySQL-5.6.24-1.linux_glibc2.5.x86_64.rpm-bundle.tar_linux mysql 安装 mysql-5.6.24-1.linux_glibc2.5.x86_6-程序员宅基地

文章浏览阅读2.8k次。一,下载mysql:http://dev.mysql.com/downloads/mysql/; 打开页面之后,在Select Platform:下选择linux Generic,如果没有出现Linux的选项,请换一个浏览器试试。我用的谷歌版本不可以,换一个别的浏览器就行了,如果还是不行,需要换一个翻墙的浏览器。 二,下载完后解压缩并放到安装文件夹下: 1、MySQL-client-5.6.2_linux mysql 安装 mysql-5.6.24-1.linux_glibc2.5.x86_64.rpm-bundle