二、列表(java)
目录
一、单项列表
二、双向列表
三、约瑟夫问题(单项列表)
一、单项列表
链表的优点:
由于链表上的元素在空间存储上内存地址不连续。
所以随机增删元素的时候不会有大量元素位移,因此随机增删效率较高。
在以后的开发中,如果遇到随机增删集合中元素的业务比较多时,建议
使用LinkedList。
链表的缺点:
不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头
节点开始遍。
注意:
public class ListNode{int val;ListNode next; //链表指向的下一个值的指针ListNode(int x){val = x;} //这个方式赋值
}
通过xx.next = new ListNode(4);来赋值,注意此时是赋值给下一个指针指向的位置,此时此链表一个值,值为4。
单项列表例子
package Linked;public class GoodsNode {public int id;public String name;public Double price;@Overridepublic String toString() {return "GoodsNode{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}public GoodsNode next;public GoodsNode(int id, String name, Double price) {this.id = id;this.name = name;this.price = price;}
}
package Linked;public class DLLinkedList {GoodsNode node = new GoodsNode(0, "", 0.0);//往链表中插入数据(在最后插入)public void add(GoodsNode goodsNode) {GoodsNode temp = node;while (true) {if (temp.next == null) {break;}temp = temp.next;}temp.next = goodsNode;}//添加节点(按照顺序)//按照商品id进行排序,从小到达按顺序添加public void addOrder(GoodsNode goodsNode) {GoodsNode temp = node;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id > goodsNode.id) {break;} else if (temp.next.id == goodsNode.id) {flag = true;break;}temp = temp.next;}if (flag) {System.out.println("该商品已存在");} else {goodsNode.next = temp.next;temp.next = goodsNode;}}//修改节点//1、直到链表中的最后—个节点未找到,则结束循环//2、找到了节点,结束循环public void updateNode(GoodsNode goodsNode){//如果链表为空if(node.next==null){System.out.println("链表为空");return;}GoodsNode temp =node.next;boolean flag =false;while (true){if(temp==null){break;}if(temp.id==goodsNode.id){flag=true;break;}temp=temp.next;}if(flag){//真正的修改节点temp.name=goodsNode.name;temp.price=goodsNode.price;}else {System.out.println("在整个链表中未找到链表节点");}}//删除节点//条件:根据节点的编号删除public void delNode(int id) {GoodsNode temp = node;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id == id) {flag = true;break;}temp = temp.next;}if(flag){temp.next=temp.next.next;}else {System.out.println("未找到删除的节点");}}//查询列表public void list(){if(node.next==null){System.out.println("空链表");return;}GoodsNode temp =node.next;while (true){if(temp==null){break;}System.out.println(temp);temp=temp.next;}}
}
public class LinkedTest {public static void main(String[] args) {DLLinkedList linkedList = new DLLinkedList();GoodsNode goodsNode1 = new GoodsNode(1,"耐克运动鞋",599.00);GoodsNode goodsNode2 = new GoodsNode(2,"耐克上衣",399.00);GoodsNode goodsNode3 = new GoodsNode(3,"阿迪达斯运动鞋",699.00);GoodsNode goodsNode4 = new GoodsNode(4,"李宁运动鞋",499.00);linkedList.addOrder(goodsNode3);linkedList.addOrder(goodsNode1);linkedList.addOrder(goodsNode2);linkedList.addOrder(goodsNode4);linkedList.list();System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");linkedList.updateNode(new GoodsNode(1,"新科技鞋子",1999.9));linkedList.list();System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");linkedList.delNode(1);linkedList.list();}
}
二、双向列表
双向列表例子
public class BookNode {public int id;public String name;public double price;public BookNode next;public BookNode pre;public BookNode(int id, String name, double price) {this.id = id;this.name = name;this.price = price;}@Overridepublic String toString() {return "DualLinkedList{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}}
public class DualLinkedList {BookNode head = new BookNode(0, "", 0);//添加结尾新的节点public void addLast(BookNode newNode) {BookNode temp = head;while (true) {//如果第一次进入,表示双向链表是空数据if (temp.next == null) {break;}temp = temp.next;}temp.next = newNode;newNode.pre = temp;}//根据顺序添加新的列表public void addOrder(BookNode newNode) {BookNode temp = head;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id>newNode.id) {break;} else if (temp.id == newNode.id) {flag = true;break;}temp = temp.next;}if (flag) {System.out.println("该书已存在");} else {if(temp.next!=null){newNode.next=temp.next;temp.next.pre=newNode;temp.next=newNode;newNode.pre=temp;}else {temp.next=newNode;newNode.pre=temp;}}}//修改节点public void updateNode(BookNode node) {if (head.next == null) {System.out.println("空链表");return;}BookNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == node.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.name = node.name;temp.price = node.price;} else {System.out.println("未找到修改的节点");}}//删除节点public void delNode(BookNode node) {if (head.next == null) {System.out.println("双向链表为空");return;}BookNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == node.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.pre.next = temp.next;if (temp.next != null) {temp.next.pre = temp.pre;}}}public void list() {if (head.next == null) {System.out.println("空链表");return;}BookNode temp = head.next;while (true){if(temp==null){break;}System.out.println(temp);temp=temp.next;}}
}
public class Test {public static void main(String[] args) {DualLinkedList dualLinkedList = new DualLinkedList();BookNode bookNode1= new BookNode(1,"红楼梦",66.0);BookNode bookNode2= new BookNode(2,"西游记",66.0);BookNode bookNode3= new BookNode(3,"水浒传",66.0);BookNode bookNode4= new BookNode(4,"三国演义",66.0);dualLinkedList.addOrder(bookNode3);dualLinkedList.addOrder(bookNode1);dualLinkedList.addOrder(bookNode2);dualLinkedList.addOrder(bookNode4);dualLinkedList.list();}
}
三、约瑟夫问题(单项列表)
约瑟夫问题的示意
osephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
n = 5 , 即有5个人
k = 1, 从第一个人开始报数
m = 2, 数2下
构建环形链表
约瑟夫问题代码展示
//节点的对象
public class Boy {//结点编号private int no;//指向下一个节点private Boy next;public Boy(int no) {this.no = no;}public int getNo() {return no;}public void setNo(int no) {this.no = no;}public Boy getNext() {return next;}public void setNext(Boy next) {this.next = next;}
}
public class CircleSingleLinkedLList {private Boy first = new Boy(-1);//构建环形链表public void addBoy(int nums){if(nums<1){System.out.println("数据不正确");return;}Boy temp =null;for(int i = 1;i<=nums;i++){Boy boy = new Boy(i);//判断是否是第一个小孩if(i==1){first= boy;first.setNext(first);temp=first;}else{temp.setNext(boy);boy.setNext(first);temp=boy;}}}//查看环形链表中的节点public void showBoy(){if(first==null){System.out.println("链表为空");return;}Boy boy =first;while (true){System.out.printf("小孩的编号%d\n",boy.getNo());if(boy.getNext()==first){break;}boy = boy.getNext();}}
//当调用该方法输入第几个小孩子数数,数几次,环形链表中一共几个小孩public void countBoy(int startNo,int countNum,int nums ){if(first==null||startNo<1||startNo>nums){System.out.println("参数输入有错");return;}//定义辅助指点,指向的是环形单链表中的最后一个节点Boy helper = first;while (true){if(helper.getNext()==first){break;}helper=helper.getNext();}//寻找起始位置,把first定义为起始位置for(int j =0;j<startNo-1;j++){first=first.getNext();helper=helper.getNext();}//当小孩进行报数时,数到m的小孩进行出列,让first和helper移动m-1次即可。//找到了出列小孩while (true){if(helper==first){break;}for(int j =0;j<countNum-1;j++){first=first.getNext();helper=helper.getNext();}System.out.printf("小孩子%d 出列\n",first.getNo());first=first.getNext();helper.setNext(first);}System.out.printf("最后出圈的小孩子编号%d\n",first.getNo());}}
public class TestBoy {public static void main(String[] args) {CircleSingleLinkedLList circleSingleLinkedLList = new CircleSingleLinkedLList();circleSingleLinkedLList.addBoy(5);circleSingleLinkedLList.showBoy();circleSingleLinkedLList.countBoy(1,2,5);}
}
二、列表(java)相关推荐
- 20145207《Java程序设计》实验二(Java面向对象程序设计)实验报告
<Java程序设计>实验二(Java面向对象程序设计)实验报告 目录 改变 Java面向对象程序设计实验要求 实验成果 课后思考 改变 看了下之前实验二的整体,很搞笑,大图+代码,没了.. ...
- 一点一点看JDK源码(二)java.util.List
一点一点看JDK源码(二)java.util.List liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 List译为表,一览表, ...
- 2018-2019-2 20175227张雪莹《Java程序设计》 实验二《Java面向对象程序设计》
2018-2019-2 20175227张雪莹<Java程序设计> 实验二<Java面向对象程序设计> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学 ...
- 华软java综合实验二_2018-2019-2 20175311 实验二 《Java开发环境的熟悉》实验报告
2018-2019-2 20175303 实验二 <Java开发环境的熟悉>实验报告 一.实验准备 1.了解掌握实验所要用到的三种代码 伪代码 产品代码 测试代码 2.IDEA中配置单元测 ...
- 二刷java {2020年7月20日22:33:58}
一.Java入门 常用dos命令 返回上一级 cd.. 进入文件夹:cd 文件名 盘符切换:盘符: 查询所在文件夹所有文件:dir 新建文件: cd>文件全名 删除文件:del 文件全名 新建文 ...
- 【朝花夕拾】Android性能篇之(二)Java内存分配
前言 原文:[朝花夕拾]Android性能篇之(二)Java内存分配 在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给 ...
- 20155328 《Java程序设计》 实验二(Java面向对象程序设计) 实验报告
20155328 <Java程序设计> 实验二(Java面向对象程序设计) 实验报告 单元测试 一.单元测试和TDD 编程时需理清思路,将编程需求等想好,再开始编.此部分可用伪代码实现. ...
- Java NIO系列教程(十二) Java NIO与IO
原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov 译者:郭蕾 校对:方腾飞 当学习了Java ...
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- print arraylist 显示的不是内容_泛型数组列表 java.util.ArrayListlt;Egt;
泛型数组列表 java.util.ArrayList<E> ArrayList<E>(int initialCapacity) // 用指定容量构建一个空数组列表 ArrayL ...
最新文章
- 院士论坛 | 郭毅可院士:人工智能的热望与冷思考
- android之下载416错误
- php serialize和json_encode哪个更快_世界 10 大编程语言,Java 不是第一,PHP 才第五...
- java加载jdbc驱动,加载JDBC驱动
- PAT_1032验证身份(15)
- linux下mysql数据的导出和导入
- PSP金手指CMF_r21d修改版安装方法
- 【UnityDragonBone】2D像纸娃娃系统所需资料
- ipv6的127位掩码如何表示_IP地址与子网掩码划分经验分享
- Java读取星历excel数据并计算卫星坐标
- Android版本和SDK版本
- ASUS ROG Win10.21H1 x64专业工作站极速精简优化版
- JSP实现文件下载功能
- 少儿机器人教育在国内的情况
- windows_7_ultimate_with_sp1_x64位旗舰版
- VTK笔记-图形相关-多边形数据转换图像数据-vtkPolyData转换为vtkImageData
- Hadoop实战-MR倒排索引(三)
- 2018年内大892数据结构部分参考答案
- Python养发之路 - 安装篇
- Cron 表达式详解和案例
热门文章
- Spring Boot 菜鸟教程 2 Data JPA
- paypal 接口开发 的官方文档 html变量的定义 国别代码 货币代码
- python 编辑excel需要什么包,python操作excel的包(openpyxl、xlsxwriter)
- XCAP发包工具的使用
- easyui_datagrid模板代码
- CorelDRAWX4的VBA插件开发(十四)快速定位形状
- 爬虫实例之获取豆瓣前250名电影名称
- imx226_【索尼IMX136LQJ-C、IMX236LQJ-C、IMX226CQJ-C、IMX274LQC-C、】价格_厂家 - 中国供应商...
- 金橙子打标卡二次开发应用
- P2P网络及节点发现机制