位置: IT常识 - 正文

链表(链表的优缺点有哪些)

编辑:rootadmin
链表 1 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。 2 单链表 商品结点类 package com.acti.linkedList; /** * author hongyeci * date 20220722 * version 1.0 ... 链表1 链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。2 单链表

推荐整理分享链表(链表的优缺点有哪些),希望有所帮助,仅作参考,欢迎阅读内容。

链表(链表的优缺点有哪些)

文章相关热门搜索词:链表和顺序表的区别,链表的特点,链表和数组的区别,链表不具有的特点是,链表数据结构,链表不具有的特点是,链表不具有的特点是,链表c语言,内容如对您有帮助,希望把文章链接给更多的朋友!

商品结点类package com.acti.linkedList;/** * author hongyeci * date 20220722 * version 1.0 * remark 单链表--商品类 */public class GoodsNode { private int goodsId; private String goodsName; private double goodsPrice; private GoodsNode next; public GoodsNode() { } public GoodsNode(int goodsId, String goodsName, double goodsPrice) { this.goodsId = goodsId; this.goodsName = goodsName; this.goodsPrice = goodsPrice; } public int getGoodsId() { return goodsId; } public void setGoodsId(int goodsId) { this.goodsId = goodsId; } public String getGoodsName() { return goodsName; } public void setGoodsName(String goodsName) { this.goodsName = goodsName; } public double getGoodsPrice() { return goodsPrice; } public void setGoodsPrice(double goodsPrice) { this.goodsPrice = goodsPrice; } public GoodsNode getNext() { return next; } public void setNext(GoodsNode next) { this.next = next; } @Override public String toString() { return "GoodsNode{" + "goodsId=" + goodsId + ", goodsName='" + goodsName + '\'' + ", goodsPrice=" + goodsPrice + ", next=" + next + '}'; }}带有头结点的单链表package com.acti.linkedList;/** * author hongyeci * date 20220722 * version 1.0 * remark 带有头结点的单链表 */public class SingleLinkedList { private GoodsNode node = new GoodsNode(0,"头结点",0.0); /** * 增加结点-添加到末尾结点 * @param goodsNode 商品结点 */ public void addNode(GoodsNode goodsNode){ GoodsNode temp = node; while(true){ if (temp.getNext() == null){ break; } temp=temp.getNext(); } temp.setNext(goodsNode); } /** * 指定位置插入值 * 按照商品id值顺序插入到链表中 * @param goodsNode */ public void insertNode(GoodsNode goodsNode){ GoodsNode temp = node; boolean flag = false; while(true){ if (temp.getNext() == null){ break; } if (temp.getNext().getGoodsId()>goodsNode.getGoodsId()){ break; }else if (temp.getNext().getGoodsId() == goodsNode.getGoodsId()){ flag = true; break; } temp=temp.getNext(); } if (flag){ throw new RuntimeException("不能插入重复的商品..."); }else { goodsNode.setNext(temp.getNext()); temp.setNext(goodsNode); } } /** * 修改指定结点data域信息 * @param goodsNode */ public void updateNode(GoodsNode goodsNode){ GoodsNode temp = node; if (temp.getNext() == null){ throw new RuntimeException("该链表为空链表,不能进行修改操作..."); } boolean flag = false; while (true){ //1 直到最后一个结点 if (temp.getNext()==null){ break; } //2 找到指定结点 if (temp.getNext().getGoodsId()==goodsNode.getGoodsId()){ flag = true; break; } temp = temp.getNext(); } if (flag){ //修改指定结点data域数据 temp.getNext().setGoodsName(goodsNode.getGoodsName()); temp.getNext().setGoodsPrice(goodsNode.getGoodsPrice()); }else { throw new RuntimeException("未找到指定结点..."); } } /** * 删除指定结点 * 根据结点ID删除指定结点 * @param goodsId */ public void deleteNode(int goodsId){ //判断链表是否为空 if (node.getNext() == null){ throw new RuntimeException("该链表为空链表,不能进行删除操作..."); } GoodsNode temp = node; //头结点 boolean flag = false; //是否做删除操作标识 //遍历链表结点 获取指定结点 while (true){ //遍历至最后一个结点 退出遍历 if (temp.getNext()==null){ break; } //找到指定结点 if (temp.getNext().getGoodsId()==goodsId){ flag = true; break; } temp = temp.getNext(); } if (flag){ //删除操作 temp.setNext(temp.getNext().getNext()); }else { throw new RuntimeException("未找到指定删除结点..."); } } /** * 获取当前单链表的结点个数 * @return */ public int lengthNode(){ int length = 0; GoodsNode temp = node.getNext(); while (temp!=null){ length++; temp = temp.getNext(); } return length; } /** * 查看链表元素 */ public void listNode(){ if (node.getNext()==null){ System.out.println("空链表..."); }else { GoodsNode temp = node; while (true){ if (temp.getNext()==null){ break; } temp = temp.getNext(); System.out.println(temp); } } }}3 双链表

图书结点类package com.acti.linkedList;/** * author hongyeci * date 20220725 * version 1.0 * remark 双链表--图书类 */public class BooksNode { private int id; private String name; private double price; private BooksNode pre; //双链表前驱结点 private BooksNode next; //双链表后继结点 public BooksNode() { } public BooksNode(int id, String name, double price) { this.id = id; this.name = name; this.price = price; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public BooksNode getPre() { return pre; } public void setPre(BooksNode pre) { this.pre = pre; } public BooksNode getNext() { return next; } public void setNext(BooksNode next) { this.next = next; } @Override public String toString() { return "BooksNode{" + "id=" + id + ", name='" + name + '\'' + ", price=" + price + '}'; }}带有头结点的双链表package com.acti.linkedList;/** * author hongyeci * date 20220725 * version 1.0 * remark 带有头结点的双链表 */public class DoubleLinkedList { private BooksNode head = new BooksNode(0,"头结点",0.0); /** * 增加结点-添加到末尾结点 * @param booksNode 图书结点 */ public void addNode(BooksNode booksNode){ BooksNode temp = head; while(true){ if (temp.getNext() == null){ break; } temp=temp.getNext(); } temp.setNext(booksNode); booksNode.setPre(temp); } /** * 指定位置插入值 * 按照商品id值顺序插入到链表中 * @param booksNode */ public void insertNode(BooksNode booksNode){ BooksNode temp = head; boolean flag = false; while(true){ if (temp.getNext() == null){ break; } if (temp.getNext().getId()>booksNode.getId()){ break; }else if (temp.getId() == booksNode.getId()){ flag = true; break; } temp=temp.getNext(); } if (flag){ throw new RuntimeException("不能插入重复的商品..."); }else { if (temp.getNext()==null){ temp.setNext(booksNode); booksNode.setPre(temp); }else { //1、当前结点的后继结点后继节点前驱指向新结点 temp.getNext().setPre(booksNode); //2、新结点后继结点指向当前结点后继结点 booksNode.setNext(temp.getNext()); //3、新结点前驱结点指向当前结点 booksNode.setPre(temp); //4、当前结点后继结点指向新结点 temp.setNext(booksNode); } } } /** * 修改指定结点data域信息 * @param booksNode */ public void updateNode(BooksNode booksNode){ BooksNode temp = head; if (temp.getNext() == null){ throw new RuntimeException("该双向链表为空链表,不能进行修改操作..."); } boolean flag = false; while (true){ //1 直到最后一个结点 if (temp.getNext()==null){ break; } //2 找到指定结点 if (temp.getId()==booksNode.getId()){ flag = true; break; } temp = temp.getNext(); } if (flag){ //修改指定结点data域数据 temp.setName(booksNode.getName()); temp.setPrice(booksNode.getPrice()); }else { throw new RuntimeException("未找到指定结点..."); } } /** * 删除指定结点 * 根据结点ID删除指定结点 * @param id */ public void deleteNode(int id){ BooksNode temp = head; //头结点 //判断链表是否为空 if (temp.getNext() == null){ throw new RuntimeException("该链表为空链表,不能进行删除操作..."); } boolean flag = false; //是否做删除操作标识 //遍历链表结点 获取指定结点 while (true){ //遍历至最后一个结点 退出遍历 if (temp.getNext()==null){ break; } //找到指定结点 if (temp.getId()==id){ flag = true; break; } temp = temp.getNext(); } if (flag){ //1、当前结点前驱结点的后继指向当前结点的后继结点 temp.getPre().setNext(temp.getNext()); //2、当前结点的后继结点前驱指向当前结点的前驱结点 if (temp.getNext()!=null){ temp.getNext().setPre(temp.getPre()); } }else { throw new RuntimeException("未找到指定删除结点..."); } } /** * 获取当前单链表的结点个数 * @return */ public int lengthNode(){ int length = 0; BooksNode temp = head.getNext(); while (temp!=null){ length++; temp = temp.getNext(); } return length; } /** * 查看链表元素 */ public void listNode(){ if (head.getNext()==null){ System.out.println("空链表..."); }else { BooksNode temp = head; while (true){ if (temp.getNext()==null){ break; } temp = temp.getNext(); System.out.println(temp); } } }}4 单向环形链表-约瑟夫环设编号为1,2,...,n的n个人围坐成一圈,约定编号为k(1=<k<=n)的人开始从1报数,数到m的人出列,他的下一位又从1开始报数,数到m的人出列,依此类推,直到所有人都出列为止,由此产生一个出队编号的序列。节点类package com.structure.linkedList;/** * author hongyeci * date 20220829 * version 1.0 * remark 单向环形链表--结点类 */public class BoyNode { //结点编号 private int boyNo; //指向下一个结点 private BoyNode next; public BoyNode(int boyNo) { this.boyNo = boyNo; } public int getBoyNo() { return boyNo; } public void setBoyNo(int boyNo) { this.boyNo = boyNo; } public BoyNode getNext() { return next; } public void setNext(BoyNode next) { this.next = next; }}单向循环链表-约瑟夫环package com.structure.linkedList;/** * author hongyeci * date 20220830 * version 1.0 * remark 单向环形链表--约瑟夫环 */public class CircleSingleLinkedList { private BoyNode firstNode = new BoyNode(-1); /** * 定义单向环形链表 * @param nums 结点个数 */ public void initCircleSingleLinkedList(int nums){ if (nums<1){ System.out.println("结点个数不能小于1"); return; } //定义辅助结点,新进的结点赋给辅助结点 BoyNode temp = null; for (int i=1;i<=nums;i++){ BoyNode newBoy = new BoyNode(i); if (i == 1){ //首结点时 firstNode = newBoy; firstNode.setNext(firstNode); temp = firstNode; }else { temp.setNext(newBoy); newBoy.setNext(firstNode); temp=newBoy; } } } /** * 遍历输出循环链表--链表结点的编号 */ public void showCircleList(){ if (firstNode == null){ System.out.println("该链表为空.."); return; } BoyNode node = firstNode; while (true){ System.out.printf("当前结点编号为:%d\n",node.getBoyNo()); //遍历到最后一个结点时,退出 if (node.getNext()==firstNode){ break; } node = node.getNext(); } } /** * 约瑟夫环问题: * 设编号为1,2,...,n的n个人围坐成一圈,约定编号为k(1=<k<=n)的人开始从1报数,数到m的人出列, * 他的下一位又从1开始报数,数到m的人出列,依此类推,直到所有人都出列为止,由此产生一个出队编号的序列。 * @param startNo 开始结点 * @param count 间隔结点数 * @param nums 单向循环链表中结点个数 */ public void handle(int startNo,int count,int nums){ if(startNo>nums || startNo<1 || firstNode==null){ System.out.println("参数错误.."); return; } //定义辅助结点,指向最后一个结点 BoyNode lastNode = firstNode; while (true){ if (lastNode.getNext() == firstNode){ //找到最后结点时退出 break; } lastNode = lastNode.getNext(); } //确定编号为startNo的结点移动次数startNo-1 找到firstNode、lastNode for(int i=0;i<startNo-1;i++){ firstNode = firstNode.getNext(); lastNode = lastNode.getNext(); } //开始数数,数到count的结点出列 while (true){ if (lastNode == firstNode){ //单项循环链表中只剩一个结点时 出列 System.out.printf("最后一个结点%d出列\n",firstNode.getBoyNo()); break; } //数数// firstNode.setBoyNo(firstNode.getBoyNo()+(count-1));// lastNode.setBoyNo(lastNode.getBoyNo()+(count-1)); for (int i=0;i<count-1;i++){ firstNode = firstNode.getNext(); lastNode = lastNode.getNext(); } //出列 System.out.printf("结点%d出列\n",firstNode.getBoyNo()); //构成循环链表 firstNode = firstNode.getNext(); lastNode.setNext(firstNode); } }}
本文链接地址:https://www.jiuchutong.com/zhishi/310634.html 转载请保留说明!

上一篇:织梦dedecms如何禁止发布重复文章(织梦dedecms如何升级ckeditor)

下一篇:[JSOI2010]连通数(连通函数)

  • 华为nova5i在哪里下载东西(华为nova5i在哪里插卡)

    华为nova5i在哪里下载东西(华为nova5i在哪里插卡)

  • Word字体加黑怎么设置(word字体怎么加黑)

    Word字体加黑怎么设置(word字体怎么加黑)

  • 5g来了wifi版ipad能用吗(ipad5g版和wifi版是什么意思)

    5g来了wifi版ipad能用吗(ipad5g版和wifi版是什么意思)

  • 3040乘1440分辨率是几k(3040*1440分辨率)

    3040乘1440分辨率是几k(3040*1440分辨率)

  • 拼多多走步在哪里(拼多多走步在哪关闭)

    拼多多走步在哪里(拼多多走步在哪关闭)

  • 激光打印机能打照片吗(激光打印机能打多少张)

    激光打印机能打照片吗(激光打印机能打多少张)

  • 虚拟发货什么意思(虚拟发货什么意思咸鱼)

    虚拟发货什么意思(虚拟发货什么意思咸鱼)

  • 小米10和10pro区别外观(小米10和10pro哪个更好)

    小米10和10pro区别外观(小米10和10pro哪个更好)

  • 华为手机微信右下角有盾牌标是什么意思(华为手机微信右上角加把锁)

    华为手机微信右下角有盾牌标是什么意思(华为手机微信右上角加把锁)

  • 怎么删除微信聊天对话框(怎么删除微信聊天背景)

    怎么删除微信聊天对话框(怎么删除微信聊天背景)

  • ipad可以连安卓手机热点吗(iPad可以连安卓蓝牙吗)

    ipad可以连安卓手机热点吗(iPad可以连安卓蓝牙吗)

  • 安卓手机网络连接不可用是怎么回事(安卓手机网络连接失败怎么回事)

    安卓手机网络连接不可用是怎么回事(安卓手机网络连接失败怎么回事)

  • watch怎么开机(iphonewatch怎么开机)

    watch怎么开机(iphonewatch怎么开机)

  • iphonexs尺寸长宽厘米(iphonexs尺寸长宽高)

    iphonexs尺寸长宽厘米(iphonexs尺寸长宽高)

  • 快手如何快速取关多人(快手如何快速取消赞)

    快手如何快速取关多人(快手如何快速取消赞)

  • 苹果a1524是什么机型(苹果a1524是什么型号)

    苹果a1524是什么机型(苹果a1524是什么型号)

  • 搜狗输入法自动搜索关闭(搜狗输入法自动计算怎么设置)

    搜狗输入法自动搜索关闭(搜狗输入法自动计算怎么设置)

  • 抖音怎样评论带图(抖音怎么评论有意思)

    抖音怎样评论带图(抖音怎么评论有意思)

  • 小米5sp双卡双待吗(小米5s plus双卡能用电信卡吗?)

    小米5sp双卡双待吗(小米5s plus双卡能用电信卡吗?)

  • 微信文件损坏怎么办(微信文件损坏怎么回事)

    微信文件损坏怎么办(微信文件损坏怎么回事)

  • 抖音被@的记录怎么删除(被抖音平台记录了会怎么样)

    抖音被@的记录怎么删除(被抖音平台记录了会怎么样)

  • iphonex授权在哪里打开(苹果xr授权)

    iphonex授权在哪里打开(苹果xr授权)

  • 怎样看cpu的主频(怎么看cpu的主频)

    怎样看cpu的主频(怎么看cpu的主频)

  • v1818a是啥手机(v1818a是什么手机)

    v1818a是啥手机(v1818a是什么手机)

  • 苹果x怎么没有设备管理(苹果x怎么没有电池百分比的功能)

    苹果x怎么没有设备管理(苹果x怎么没有电池百分比的功能)

  • 换手机号原来微信咋登(换手机号原来微信登不上)

    换手机号原来微信咋登(换手机号原来微信登不上)

  • 默认网关不可用win10解决方法(以太网默认网关不可用)

    默认网关不可用win10解决方法(以太网默认网关不可用)

  • 出差补贴没有发票怎么做账
  • 缴纳的增值税在资产负债表中怎么体现
  • 企业付的快递费是扣增值税还是进入费用扣除
  • 行政单位的财务报告包括财务报表和财务情况说明书
  • 月末计提账务处理
  • 个体户没有营业执照怎么举报
  • 代扣代缴公积金有返还吗
  • 赠送电影票的说辞
  • 监督机关包括哪些
  • 营改增工程计价规则
  • 母子公司划转房产怎么办
  • 怎么区分汇总原始凭证与累计原始凭证?
  • 收到投资款现金流量项目是什么
  • 充值销售技巧和话术总结
  • 公积金可以在个税前全额扣除吗
  • 技术发明案例
  • 缴纳残保金和工龄有关吗
  • 财务费用包括哪些主要内容
  • 公司注销时帐面清算
  • 与收益相关的政府补助的确认
  • 资产预测怎么写
  • 怎么激活win10密钥
  • 固态被锁了
  • 高新技术企业研究开发费用加计扣除
  • 2022年最新cpu天梯图手机
  • rteng7.exe - rteng7是什么进程 有什么用
  • 小米路由器599元
  • 罚款是否需要开发票
  • h5响应式布局是什么
  • 公司注销后虚开能查吗
  • 收到债劵利息会减少吗
  • auto learn
  • vue 登陆
  • 政府补贴收入确认政策
  • 弥补以前年度亏损报表怎么填
  • 律师事务所执业证
  • 物价变动的影响因素
  • 学网新用什么电脑
  • 库存现金写三栏式明细账还是写现金日记账还是两个都写
  • 没有原始凭证可以记账吗
  • access untagged
  • 计提电费的会计分录怎么写
  • 坏账核销的会计规定
  • 房地产行业概况
  • 一般纳税人工程劳务发票税率是多少
  • 研发费用加计扣除的条件
  • 技术报酬金是什么意思
  • 抵债资产如何做债权转让
  • 退货对方不开具红字发票怎么办
  • 无法收回的款项怎么记账
  • 转账支票怎么填写会计凭证
  • 期初建账怎么做
  • 工程费用科目
  • sql比较两个集合
  • VMWare linux mysql 5.7.13安装配置教程
  • xp系统不能搜索
  • fedora31安装教程
  • 如何删除windows.old
  • win2008如何安装telnet
  • windows7怎
  • 双硬盘需要设置主从盘吗
  • Win10打开设备管理器
  • rtmservice.exe - rtmservice是什么进程 有什么用
  • win10系统怎么设置电脑密码
  • javascript冒泡排序代码
  • shell中特殊字符的含义
  • python科学绘图
  • javascript怎么用
  • javascript SpiderMonkey中的函数序列化如何进行
  • javascript web开发
  • jquery右击事件
  • javascript运用
  • python日志文件
  • js继承的方法
  • 国家审计署查民营企业
  • 税务局六大攻坚
  • 税务局开蔬菜普票需要几个点
  • 国家税务总局2016年17号公告
  • 北京车过户到廊坊标准
  • 在京东上买货
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设