链表是有序的列表
链表是以节点的方式来存储的,各个节点不一定是连续存储的
分为带头节点的链表和没有头节点的链表
头节点不存放具体数据

单向链表:
其中每一个节点包含一个存储数据的data,一个指向下一个节点的变量

class Team {int no;String leader;public Team(int no, String leader) {this.no = no;this.leader = leader;}@Overridepublic String toString() {return "Team{" +"no=" + no +", leader='" + leader + '\'' +'}';}
}class TeamNode {Team team;TeamNode nextNode;public TeamNode(Team team) {this.team = team;}@Overridepublic String toString() {return "TeamNode{" +"team=" + team +'}';}
}class TeamNodeList {private TeamNode headNode = new TeamNode(null);//添加元素,找到链表最后一个元素,让最后一个元素的next节点指向新元素public void add(Team team) {TeamNode curNode = headNode;TeamNode teamNode = new TeamNode(team);while(curNode.nextNode != null) {curNode = curNode.nextNode;}curNode.nextNode = teamNode;}//按编号顺序添加元素,遍历链表,找到当前节点的下一个节点的编号大于新元素编号的当前节点//将新节点的next节点指向当前节点的下一个节点,当前节点的next节点指向新节点public void addByOrder(Team team) {TeamNode curNode = headNode;TeamNode teamNode = new TeamNode(team);while(curNode.nextNode != null) {if(curNode.nextNode.team.no > team.no) {break;}curNode = curNode.nextNode;}teamNode.nextNode = curNode.nextNode;curNode.nextNode = teamNode;}//根据编号修改节点内容//遍历链表找到编号相同的队伍数据,将内容设置为新队伍的数据public void update(Team team) {TeamNode curNode = headNode;while(curNode.nextNode != null) {if(curNode.nextNode.team.no == team.no) {break;}curNode = curNode.nextNode;}if(curNode.nextNode == null) {System.out.println("没有找到对应队伍");return;}curNode.nextNode.team.leader = team.leader;}//根据编号删除节点//遍历链表,找到删除节点,将删除节点前的节点的next节点指向删除节点的next节点public void deleteNode(int no) {TeamNode curNode = headNode;while(curNode.nextNode != null) {if(curNode.nextNode.team.no == no) {break;}curNode = curNode.nextNode;}if(curNode.nextNode == null) {System.out.println("没有找到对应队伍");return;}curNode.nextNode = curNode.nextNode.nextNode;}//遍历节点打印public void listNodes() {TeamNode curNode = headNode;while(curNode.nextNode != null) {System.out.println(curNode.nextNode.team);curNode = curNode.nextNode;}}//求单链表中有效节点的个数public void test1(TeamNode headNode) {TeamNode curNode = headNode;int len = 0;while(curNode.nextNode != null) {len++;curNode = curNode.nextNode;}System.out.println("有效节点有:" + len + "个");}//查找链表中倒数第k个节点public void test2(int k) {TeamNode curNode = headNode;int len = 0;while(curNode.nextNode != null) {len++;curNode = curNode.nextNode;}if( k > len) {System.out.println("超过链表长度");return;}curNode = headNode;for(int i = 0;i < len - k;i++) {curNode = curNode.nextNode;}System.out.println(curNode.team);}//单链表的反转public void test3() {TeamNode curNode = headNode.nextNode;TeamNode newHeadNode = new TeamNode(null);while(curNode != null) {TeamNode tmpNode = newHeadNode.nextNode; // 存放新头节点的next节点TeamNode nextNode = curNode.nextNode; // 存放当前节点的next节点//            newHeadNode.nextNode = curNode; // 新头节点的next节点指向新元素节点
//            newHeadNode.nextNode.nextNode = tmpNode; //新头节点的next节点的next节点指向 上一次的新头节点的next节点,串起来//或curNode.nextNode = newHeadNode.nextNode;newHeadNode.nextNode = curNode;curNode = nextNode; //当前节点指向 下一个节点}headNode.nextNode = newHeadNode.nextNode; //原来的头节点的next节点指向新头节点的next节点,后面的元素都是反转后的listNodes();}//从尾到头打印单链表//使用stack,不用破坏原始链表结构public void test4() {Stack<Team> teamStack = new Stack<>();TeamNode curNode = headNode;while(curNode.nextNode != null) {teamStack.push(curNode.nextNode.team);curNode = curNode.nextNode;}while (! teamStack.isEmpty()) {System.out.println(teamStack.pop());}}
}public class LinkedDemo {@Testpublic void test1() {TeamNodeList teamNodeList = new TeamNodeList();Team team1 = new Team(1, "山本元柳斎重国");Team team4 = new Team(4, "卯之花烈");Team team6 = new Team(6, "朽木白哉");Team team8 = new Team(8, "京乐春水");Team team10 = new Team(10, "日番谷冬狮郎");Team team13 = new Team(13, "浮竹十四郎");Team team13_new = new Team(13, "朽木露琪亚");teamNodeList.add(team1);teamNodeList.add(team4);teamNodeList.add(team6);teamNodeList.add(team13);}public static void main(String[] args) {TeamNodeList teamNodeList = new TeamNodeList();Team team1 = new Team(1, "山本元柳斎重国");Team team4 = new Team(4, "卯之花烈");Team team6 = new Team(6, "朽木白哉");Team team8 = new Team(8, "京乐春水");Team team10 = new Team(10, "日番谷冬狮郎");Team team13 = new Team(13, "浮竹十四郎");Team team13_new = new Team(13, "朽木露琪亚");teamNodeList.add(team1);teamNodeList.add(team4);teamNodeList.add(team6);teamNodeList.add(team13);System.out.println("============add============");teamNodeList.listNodes();
//        Team{no=1, leader='山本元柳斎重国'}
//        Team{no=4, leader='卯之花烈'}
//        Team{no=6, leader='朽木白哉'}
//        Team{no=13, leader='浮竹十四郎'}System.out.println("============addByOrder============");teamNodeList.addByOrder(team8);teamNodeList.listNodes();
//        Team{no=1, leader='山本元柳斎重国'}
//        Team{no=4, leader='卯之花烈'}
//        Team{no=6, leader='朽木白哉'}
//        Team{no=8, leader='京乐春水'}
//        Team{no=13, leader='浮竹十四郎'}System.out.println("============update============");teamNodeList.update(team13_new);teamNodeList.listNodes();
//        Team{no=1, leader='山本元柳斎重国'}
//        Team{no=4, leader='卯之花烈'}
//        Team{no=6, leader='朽木白哉'}
//        Team{no=8, leader='京乐春水'}
//        Team{no=13, leader='朽木露琪亚'}System.out.println("============deleteNode============");teamNodeList.deleteNode(4);teamNodeList.listNodes();
//        Team{no=1, leader='山本元柳斎重国'}
//        Team{no=6, leader='朽木白哉'}
//        Team{no=8, leader='京乐春水'}
//        Team{no=13, leader='朽木露琪亚'}System.out.println("============test3 反转============");teamNodeList.test3();
//        Team{no=13, leader='朽木露琪亚'}
//        Team{no=8, leader='京乐春水'}
//        Team{no=6, leader='朽木白哉'}
//        Team{no=1, leader='山本元柳斎重国'}System.out.println("============test4 从尾到头打印单链表============");teamNodeList.test4();
//        Team{no=1, leader='山本元柳斎重国'}
//        Team{no=6, leader='朽木白哉'}
//        Team{no=8, leader='京乐春水'}
//        Team{no=13, leader='朽木露琪亚'}}}

Java 单向链表模拟相关推荐

  1. JAVA单向链表实现

    JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...

  2. java 单向链表 双向链表_java 单向链表与双向链表的实现

    链表 单向链表 单向链表概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 这是一种物理结构,不是树那样的逻辑结构.链表和顺序表两种物理结构, ...

  3. java单向链表详解

    1.概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个 ...

  4. Java 单向链表和单向循环链表的代码实现

    这个链表,以前上学的时候,学c语言,还是数据结构的时候,学过.也许也实现过吧.下面我就简单记录下这个链表的实现. 单向链表跟单向循环链表的差别就是:单向链表是有结束位的,指向null的时候,就到结尾了 ...

  5. Java单向链表反转

    要求 给出单链表的头节点 head ,要求反转链表,并返回反转后的链表. 实现原理 单向链表反转就是将链表的指针方向改变.由于单链表没有指向前一个结点的指针,所以,我们定义一个指向前一个节点的指针pr ...

  6. java单向链表中的头插法与尾插法

    单链表属于数据结构中的一种基本结构,是一种线性结构,在此使用Java对其中的头插法以及尾插法进行解释.数据结构 首先定义好链表中的节点类: 其中,data表明节点所存放的数据,next表明指向下一节点 ...

  7. Java单向链表操作详解

    /* 先定义一个Node类用来存储节点的值域和指针域 * 即当前节点中的值和后面节点的方法 * 在C中就是相当与定义一个结构体类型一个数据域和指针域的方法 */ class LNode{//这个写法已 ...

  8. java单向链表按顺序插入节点

    实现步骤: 1.首先找到新添加的节点的位置,是通过辅助变量(指针),通过遍历来实现. 2.新的节点 next = temp.next. 3.将temp.next = 新的节点. package com ...

  9. JAVA单向/双向链表的实现

    一.JAVA单向链表的操作(增加节点.查找节点.删除节点) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2 ...

最新文章

  1. 孔子绝粮于陈蔡子贡孔子问答节选(白话)
  2. mongoose换成mysql_Package - tms-koa
  3. 从头搭建一个深度学习框架
  4. 理解类级别的访问控制权限——类的成员函数可以访问该类所有对象的私有成员
  5. (转) Lua: 给 Redis 用户的入门指导
  6. 包是如何通过交换机的
  7. JS总结 本地对象2 BOM DOM
  8. android远程控制电视,手机如何远程控制电视
  9. 离谱!诺奖得主被曝40多篇论文造假!还涉及国内高校学者!
  10. JS | 涉及字符串的内置函数的一些题目
  11. [ChneChen的随笔]中国文化清单上我们还记得什么
  12. Windows 11系统如何将“此电脑”显示在桌面?
  13. 装逼软件推荐(持续)
  14. 努比亚android最高版本,努比亚Z11安卓7.1固件开发版下载地址:新增压力按键等功能...
  15. java计算机毕业设计的小区物业管理系统源程序+mysql+系统+lw文档+远程调试java计算机毕业设计的小区物业管理系统源程序+mysql+系统+lw文档+
  16. iPhont X适配
  17. 电脑耳机没声音怎么设置?(win7/win10电脑耳机没声音的解决方法)
  18. Chart.js入门:简介
  19. 贪心算法-加勒比海盗船——最优装载问题
  20. 【安信可ESP-12K模组】

热门文章

  1. Android + https 实现 文件上传
  2. 编写HTTP代理中,上一些我的工具方法。
  3. 相机3D坐标到机械臂坐标的转换
  4. MySQL数据库—多表查询
  5. jason 序列化和反序列化
  6. 21day学通python epub_Python Day21
  7. 某手app的__NS_sig3,sig,__NStokensig算法
  8. 2022年6月电子学会考级试卷真题解析(含答案和所有文档下载)
  9. 《Python中神奇的第三方库:Faker》
  10. 【服务器租用与托管】什么是服务器托管,为什么要进行托管呢?