目录

一、单项列表

二、双向列表

三、约瑟夫问题(单项列表)


一、单项列表

链表的优点:

由于链表上的元素在空间存储上内存地址不连续。

所以随机增删元素的时候不会有大量元素位移,因此随机增删效率较高。

在以后的开发中,如果遇到随机增删集合中元素的业务比较多时,建议

使用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)相关推荐

  1. 20145207《Java程序设计》实验二(Java面向对象程序设计)实验报告

    <Java程序设计>实验二(Java面向对象程序设计)实验报告 目录 改变 Java面向对象程序设计实验要求 实验成果 课后思考 改变 看了下之前实验二的整体,很搞笑,大图+代码,没了.. ...

  2. 一点一点看JDK源码(二)java.util.List

    一点一点看JDK源码(二)java.util.List liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 List译为表,一览表, ...

  3. 2018-2019-2 20175227张雪莹《Java程序设计》 实验二《Java面向对象程序设计》

    2018-2019-2 20175227张雪莹<Java程序设计> 实验二<Java面向对象程序设计> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学 ...

  4. 华软java综合实验二_2018-2019-2 20175311 实验二 《Java开发环境的熟悉》实验报告

    2018-2019-2 20175303 实验二 <Java开发环境的熟悉>实验报告 一.实验准备 1.了解掌握实验所要用到的三种代码 伪代码 产品代码 测试代码 2.IDEA中配置单元测 ...

  5. 二刷java {2020年7月20日22:33:58}

    一.Java入门 常用dos命令 返回上一级 cd.. 进入文件夹:cd 文件名 盘符切换:盘符: 查询所在文件夹所有文件:dir 新建文件: cd>文件全名 删除文件:del 文件全名 新建文 ...

  6. 【朝花夕拾】Android性能篇之(二)Java内存分配

    前言       原文:[朝花夕拾]Android性能篇之(二)Java内存分配        在内存方面,相比于C/C++程序员,咱们java系程序员算是比较幸运的,因为对于内存的分配和回收,都交给 ...

  7. 20155328 《Java程序设计》 实验二(Java面向对象程序设计) 实验报告

    20155328 <Java程序设计> 实验二(Java面向对象程序设计) 实验报告 单元测试 一.单元测试和TDD 编程时需理清思路,将编程需求等想好,再开始编.此部分可用伪代码实现. ...

  8. Java NIO系列教程(十二) Java NIO与IO

    原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov   译者:郭蕾    校对:方腾飞 当学习了Java ...

  9. Java学习笔记二十:Java中的内部类

    Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...

  10. print arraylist 显示的不是内容_泛型数组列表 java.util.ArrayListlt;Egt;

    泛型数组列表 java.util.ArrayList<E> ArrayList<E>(int initialCapacity) // 用指定容量构建一个空数组列表 ArrayL ...

最新文章

  1. 院士论坛 | 郭毅可院士:人工智能的热望与冷思考
  2. android之下载416错误
  3. php serialize和json_encode哪个更快_世界 10 大编程语言,Java 不是第一,PHP 才第五...
  4. java加载jdbc驱动,加载JDBC驱动
  5. PAT_1032验证身份(15)
  6. linux下mysql数据的导出和导入
  7. PSP金手指CMF_r21d修改版安装方法
  8. 【UnityDragonBone】2D像纸娃娃系统所需资料
  9. ipv6的127位掩码如何表示_IP地址与子网掩码划分经验分享
  10. Java读取星历excel数据并计算卫星坐标
  11. Android版本和SDK版本
  12. ASUS ROG Win10.21H1 x64专业工作站极速精简优化版
  13. JSP实现文件下载功能
  14. 少儿机器人教育在国内的情况
  15. windows_7_ultimate_with_sp1_x64位旗舰版
  16. VTK笔记-图形相关-多边形数据转换图像数据-vtkPolyData转换为vtkImageData
  17. Hadoop实战-MR倒排索引(三)
  18. 2018年内大892数据结构部分参考答案
  19. Python养发之路 - 安装篇
  20. Cron 表达式详解和案例

热门文章

  1. Spring Boot 菜鸟教程 2 Data JPA
  2. paypal 接口开发 的官方文档 html变量的定义 国别代码 货币代码
  3. python 编辑excel需要什么包,python操作excel的包(openpyxl、xlsxwriter)
  4. XCAP发包工具的使用
  5. easyui_datagrid模板代码
  6. CorelDRAWX4的VBA插件开发(十四)快速定位形状
  7. 爬虫实例之获取豆瓣前250名电影名称
  8. imx226_【索尼IMX136LQJ-C、IMX236LQJ-C、IMX226CQJ-C、IMX274LQC-C、】价格_厂家 - 中国供应商...
  9. 金橙子打标卡二次开发应用
  10. P2P网络及节点发现机制