iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java编程内功之怎么使用单链表
  • 929
分享到

Java编程内功之怎么使用单链表

2023-06-15 16:06:44 929人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Java编程内功之怎么使用单链表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 基本介绍链表是有序的列表,但是它在内存中存储如下鸿蒙官方战略合作共建——

这篇文章将为大家详细讲解有关Java编程内功之怎么使用单链表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Java编程内功之怎么使用单链表

 基本介绍

链表是有序的列表,但是它在内存中存储如下

Java编程内功之怎么使用单链表
  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 链表是以节点的方式来存储.

  3. 每个节点包含data域,next域:指向下一个节点.

  4. 如图:发现每个链表的各个节点不一定是连续存储

  5. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定.

单链表介绍

单链表(带头节点)逻辑结构示意图如下

Java编程内功之怎么使用单链表

单链表的应用实例

使用带head头的单向链表实现-水浒英雄排行榜管理

package com.structures.linkedlist;  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, "林冲", "豹子头");         SingleLinkedList singleLinkedList = new SingleLinkedList();         singleLinkedList.add(heroNode3);         singleLinkedList.add(heroNode2);         singleLinkedList.add(heroNode4);         singleLinkedList.add(heroNode1);         singleLinkedList.list();     } }  //定义SingleLinkedList管理我们的英雄 class SingleLinkedList {     //先初始化一个头节点,头节点不能动,将来遍历用     private HeroNode head = new HeroNode(0, "", "");      //添加节点到单向链表     //思路:当不考虑编号的顺序时     //1. 找到当前链表的最后节点     //2. 将最后这个节点的next域指向新的节点     public void add(HeroNode node) {         //因为head节点不能动,因此我们需要一个辅助遍历temp         HeroNode temp = head;         //遍历链表,找到最后         while (temp.next != null) {             //找到链表的最后             //如果没有找到temp就后移             temp = temp.next;         }         temp.next = node;     }      //显示链表[遍历]     public void list() {         //判断链表是否为空         if (head.next == null) {             System.out.println("链表为空");         }         //因为头节点不能动,因此我们需要一个辅助变量来遍历         HeroNode temp = head.next;         while (temp != null) {             //判断是否到最后             //输出节点的信息             System.out.println(temp);             //将temp后移             temp = temp.next;         }     } }  //定义一个HeroNode,每个HeroNode对象就是一个节点 class HeroNode {     public int no;     public String name;     public String nickName;     public HeroNode next;//指向下一个节点      //构造器     public HeroNode(int no, String name, String nickName) {         this.no = no;         this.name = name;         this.nickName = nickName;     }      public HeroNode getNext() {         return next;     }      public void setNext(HeroNode next) {         this.next = next;     }      @Override     public String toString() {         return "HeroNode{" +                 "no=" + no +                 ", name='" + name + '\'' +                 ", nickName='" + nickName + '\'' +                 '}';     } } 

可以看到以上链表的实现方式,在添加英雄时,并未按照英雄的编号进行排序. 下面重新写一个添加方法,实现插入英雄时按编号排序

package com.structures.linkedlist;  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, "林冲", "豹子头");         SingleLinkedList singleLinkedList = new SingleLinkedList();         singleLinkedList.addByNo(heroNode3);         singleLinkedList.addByNo(heroNode2);         singleLinkedList.addByNo(heroNode4);         singleLinkedList.addByNo(heroNode1);         singleLinkedList.list();     } }  //定义SingleLinkedList管理我们的英雄 class SingleLinkedList {     //先初始化一个头节点,头节点不能动,将来遍历用     private HeroNode head = new HeroNode(0, "", "");      //添加节点到单向链表     //思路:当不考虑编号的顺序时     //1. 找到当前链表的最后节点     //2. 将最后这个节点的next域指向新的节点     public void add(HeroNode node) {         //因为head节点不能动,因此我们需要一个辅助遍历temp         HeroNode temp = head;         //遍历链表,找到最后         while (temp.next != null) {             //找到链表的最后             //如果没有找到temp就后移             temp = temp.next;         }         temp.next = node;     }      //第二种添加英雄的方式,在添加英雄时,根据排名将英雄插入到指定位置     //如果有这个排名,则添加失败,并给出提示     public void addByNo(HeroNode heroNode) {         //因为head节点不能动,因此我们需要一个辅助遍历temp         //因为单链表,因此找的temp是位于添加位置的前一个节点,否则加入不了         HeroNode temp = head;         boolean flag = false;//标识添加的编号是否存在,默认false         while (true) {             if (temp.next == null) {                 break;             }             if (temp.next.no > heroNode.no) {//位置找到,就在temp的后面插入                 break;             } else if (temp.next.no == heroNode.no) {                 //编号已存在                 flag = true;                 break;             }             temp = temp.next;         }         if (flag) {             System.out.printf("准备插入的英雄的编号 %d 已存在,不能加入\n", heroNode.no);         } else {             //插入链表temp的后面             heroNode.next = temp.next;             temp.next = heroNode;         }     }      //显示链表[遍历]     public void list() {         //判断链表是否为空         if (head.next == null) {             System.out.println("链表为空");         }         //因为头节点不能动,因此我们需要一个辅助变量来遍历         HeroNode temp = head.next;         while (temp != null) {             //判断是否到最后             //输出节点的信息             System.out.println(temp);             //将temp后移             temp = temp.next;         }     } }  //定义一个HeroNode,每个HeroNode对象就是一个节点 class HeroNode {     public int no;     public String name;     public String nickName;     public HeroNode next;//指向下一个节点      //构造器     public HeroNode(int no, String name, String nickName) {         this.no = no;         this.name = name;         this.nickName = nickName;     }      public HeroNode getNext() {         return next;     }      public void setNext(HeroNode next) {         this.next = next;     }      @Override     public String toString() {         return "HeroNode{" +                 "no=" + no +                 ", name='" + name + '\'' +                 ", nickName='" + nickName + '\'' +                 '}';     } } 

再次进行完善功能,添加修改节点功能

//修改节点的信息,根据no编号来修改,即编号no不能修改.     public void update(HeroNode heroNode) {         //判断是否为空         if (head.next == null) {             System.out.println("链表为空");         }         //找到需要修改的节点,根据no编号         HeroNode temp = head.next;         boolean flag = false;//表示节点是否找到         while (true) {             if (temp == null) {                 break;             }             if (temp.no == heroNode.no) {                 flag = true;                 break;             }             temp = temp.next;         }         if (flag) {             temp.name = heroNode.name;             temp.nickName = heroNode.nickName;         } else {             System.out.printf("没有找到 编号%d 的节点,不能修改\n", heroNode.no);         }     }

再次进行完善功能,添加删除节点功能

//删除节点     public void remove(HeroNode heroNode) {         //判断是否为空         if (head.next == null) {             System.out.println("链表为空");         }         HeroNode temp = head.next;         boolean flag = false;//标识是否找到待删除的点         while (true) {             if (temp == null) {                 break;             }             if (temp.next.no == heroNode.no) {                 flag = true;                 break;             }             temp = temp.next;         }         if (flag) {             temp.next = temp.next.next;         } else {             System.out.printf("无法删除 编号%d 的节点,\n", heroNode.no);         }     }

再次进行完善功能,添加统计单链表的有效节点数功能

     public static int getLength(HeroNode head) {         if (head.next == null) {             return 0;         }         int count = 0;         HeroNode temp = head.next;         while (temp.next != null) {             count++;             temp = temp.next;         }         return count;     }

再次进行完善功能,添加查找单链表中的倒数第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 static void reverseList(HeroNode head) {       if (head.next == null || head.next.next == null) {           return;       }       HeroNode curr = head.next;       HeroNode next = null;//指向当前节点[curr]的下一个节点       HeroNode reverseHead = new HeroNode(0, "", "");        while (curr != null) {           next = curr.next;//先暂时保存curr节点的下一个节点           curr.next = reverseHead.next;//将curr的下一个节点指向新的链表的最前端           reverseHead.next = curr;//将curr连接到新的链表上           curr = next;//让curr后移       }       head.next = reverseHead.next;   }

再次进行完善功能,添加从尾到头打印单链表功能

    public static void reversePrint(HeroNode head) {        if (head.next == null) {            return;        }        Stack<HeroNode> heroNodes = new Stack<HeroNode>();        HeroNode temp = head.next;        while (temp != null) {            heroNodes.add(temp);            temp = temp.next;        }        while (heroNodes.size() > 0) {            System.out.println(heroNodes.pop());        }    }

关于Java编程内功之怎么使用单链表就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Java编程内功之怎么使用单链表

本文链接: https://www.lsjlt.com/news/280860.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java编程内功之怎么使用单链表
    这篇文章将为大家详细讲解有关Java编程内功之怎么使用单链表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 基本介绍链表是有序的列表,但是它在内存中存储如下鸿蒙官方战略合作共建——...
    99+
    2023-06-15
  • Java编程内功之怎么用稀疏数组
    这篇文章主要讲解了“Java编程内功之怎么用稀疏数组”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java编程内功之怎么用稀疏数组”吧! 基本介绍当一个数组中大部分元素为0,或者为...
    99+
    2023-06-15
  • Java编程内功之怎么实现队列
    Java编程内功之怎么实现队列,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 基本介绍队列是一个有序列表,可以用数组或者链表来实现遵循先入先出的原则,即先存入队列的数...
    99+
    2023-06-15
  • java单链表使用总结
    链表的概念: 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点(链表中的每一个元素称为节点)组成,节点可以在运行...
    99+
    2024-04-02
  • 如何使用Java编程内功栈
    这期内容当中小编将会给大家带来有关如何使用Java编程内功栈,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 基本介绍 栈是一个先入后出(FILO First In Last Out)的有序列表栈...
    99+
    2023-06-15
  • 使用Java如何翻转单链表
    这篇文章将为大家详细讲解有关使用Java如何翻转单链表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java实现单链表反转,递归和非递归两种形式class Node { int val; ...
    99+
    2023-05-31
    java 单链表 翻转
  • Java数据结构之单链表是什么
    这篇文章给大家分享的是有关Java数据结构之单链表是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、图示二、链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接...
    99+
    2023-06-15
  • 利用java怎么实现一个单链表
    本文章向大家介绍利用java怎么实现一个单链表的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员...
    99+
    2023-06-06
  • java怎么实现单链表反转
    要实现单链表的反转,可以使用迭代或递归两种方法。 迭代法: public ListNode reverseList(ListNo...
    99+
    2023-10-26
    java
  • Java使用单链表实现约瑟夫环
    本文实例为大家分享了Java使用单链表实现约瑟夫环的具体代码,供大家参考,具体内容如下 构建一个单向的环形链表思路 1.先创建第一个节点, 让first指向该节点, 并形成环形 2....
    99+
    2024-04-02
  • java并发编程工具类JUC之LinkedBlockingQueue链表队列
    java.util.concurrent.LinkedBlockingQueue 是一个基于单向链表的、范围任意的(其实是有界的)、FIFO阻塞队列。访问与移除操作是在队头进行,添...
    99+
    2024-04-02
  • Java​逆转单向链表怎么实现
    这篇文章主要讲解了“Java逆转单向链表怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java逆转单向链表怎么实现”吧!首先这是一个单向的链表,不同于 Java 里面的 Linked...
    99+
    2023-06-04
  • Java响应式编程之handle怎么使用
    这篇文章主要介绍“Java响应式编程之handle怎么使用”,在日常操作中,相信很多人在Java响应式编程之handle怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java响应式编程之handle怎...
    99+
    2023-07-04
  • 怎么用rust实现单链表
    这篇文章将为大家详细讲解有关怎么用rust实现单链表,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言今天的目标是用rust实现一个简单的单链表LinkedList,同时为此链表提供从头部插入元素(头插法...
    99+
    2023-06-29
  • 怎么理解Java递归单链表反转
    这篇文章主要讲解了“怎么理解Java递归单链表反转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java递归单链表反转”吧!首先,咱们要先明确,什么...
    99+
    2024-04-02
  • Java中怎么定义一个简单链表
    这篇文章给大家介绍Java中怎么定义一个简单链表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述:原理:只有一个数据项(链接点Link),每个数据插入时都是对第一个数据的引用。插入数据说明:当链表没有数据时,插入...
    99+
    2023-05-31
    java
  • Java并发编程之LinkedBlockingQueue队列怎么使用
    这篇文章主要介绍了Java并发编程之LinkedBlockingQueue队列怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java并发编程之LinkedBlockingQueue队列怎么使用文章都会有...
    99+
    2023-06-30
  • 怎么在微信小程序中使用表单功能
    在微信小程序中使用表单功能的方法:1.在小程序页面添加表单容器;2.在表单容器添加组件;3.在小程序后台查看并处理用户信息;具体步骤如下:首先小程序页面中添加一个“表单容器”,表单容器里会默认放一些文本输入框组件和一个提交按钮组件,然后在右...
    99+
    2024-04-02
  • C语言中单链表怎么用
    这篇文章将为大家详细讲解有关C语言中单链表怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、单链表概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序...
    99+
    2023-06-29
  • 怎么用Python实现单向链表
    这篇文章主要介绍“怎么用Python实现单向链表”,在日常操作中,相信很多人在怎么用Python实现单向链表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python实现单向链表”的疑惑有所帮助!接下来...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作