链表

嚴華  金牌会员 | 2022-9-16 17:24:56 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 936|帖子 936|积分 2808

链表

1 链表


  • 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。
2 单链表





  • 商品结点类
  1. package com.acti.linkedList;
  2. /**
  3. * author hongyeci
  4. * date 20220722
  5. * version 1.0
  6. * remark 单链表--商品类
  7. */
  8. public class GoodsNode {
  9.     private int goodsId;
  10.     private String goodsName;
  11.     private double goodsPrice;
  12.     private GoodsNode next;
  13.     public GoodsNode() {
  14.     }
  15.     public GoodsNode(int goodsId, String goodsName, double goodsPrice) {
  16.         this.goodsId = goodsId;
  17.         this.goodsName = goodsName;
  18.         this.goodsPrice = goodsPrice;
  19.     }
  20.     public int getGoodsId() {
  21.         return goodsId;
  22.     }
  23.     public void setGoodsId(int goodsId) {
  24.         this.goodsId = goodsId;
  25.     }
  26.     public String getGoodsName() {
  27.         return goodsName;
  28.     }
  29.     public void setGoodsName(String goodsName) {
  30.         this.goodsName = goodsName;
  31.     }
  32.     public double getGoodsPrice() {
  33.         return goodsPrice;
  34.     }
  35.     public void setGoodsPrice(double goodsPrice) {
  36.         this.goodsPrice = goodsPrice;
  37.     }
  38.     public GoodsNode getNext() {
  39.         return next;
  40.     }
  41.     public void setNext(GoodsNode next) {
  42.         this.next = next;
  43.     }
  44.     @Override
  45.     public String toString() {
  46.         return "GoodsNode{" +
  47.                 "goodsId=" + goodsId +
  48.                 ", goodsName='" + goodsName + '\'' +
  49.                 ", goodsPrice=" + goodsPrice +
  50.                 ", next=" + next +
  51.                 '}';
  52.     }
  53. }
复制代码

  • 带有头结点的单链表
  1. package com.acti.linkedList;
  2. /**
  3. * author hongyeci
  4. * date 20220722
  5. * version 1.0
  6. * remark 带有头结点的单链表
  7. */
  8. public class SingleLinkedList {
  9.     private GoodsNode node = new GoodsNode(0,"头结点",0.0);
  10.     /**
  11.      * 增加结点-添加到末尾结点
  12.      * @param goodsNode 商品结点
  13.      */
  14.     public void addNode(GoodsNode goodsNode){
  15.         GoodsNode temp = node;
  16.         while(true){
  17.             if (temp.getNext() == null){
  18.                 break;
  19.             }
  20.             temp=temp.getNext();
  21.         }
  22.         temp.setNext(goodsNode);
  23.     }
  24.     /**
  25.      * 指定位置插入值
  26.      * 按照商品id值顺序插入到链表中
  27.      * @param goodsNode
  28.      */
  29.     public void insertNode(GoodsNode goodsNode){
  30.         GoodsNode temp = node;
  31.         boolean flag = false;
  32.         while(true){
  33.             if (temp.getNext() == null){
  34.                 break;
  35.             }
  36.             if (temp.getNext().getGoodsId()>goodsNode.getGoodsId()){
  37.                 break;
  38.             }else if (temp.getNext().getGoodsId() == goodsNode.getGoodsId()){
  39.                 flag = true;
  40.                 break;
  41.             }
  42.             temp=temp.getNext();
  43.         }
  44.         if (flag){
  45.             throw new RuntimeException("不能插入重复的商品...");
  46.         }else {
  47.             goodsNode.setNext(temp.getNext());
  48.             temp.setNext(goodsNode);
  49.         }
  50.     }
  51.     /**
  52.      * 修改指定结点data域信息
  53.      * @param goodsNode
  54.      */
  55.     public void updateNode(GoodsNode goodsNode){
  56.         GoodsNode temp = node;
  57.         if (temp.getNext() == null){
  58.             throw new RuntimeException("该链表为空链表,不能进行修改操作...");
  59.         }
  60.         boolean flag = false;
  61.         while (true){
  62.             //1 直到最后一个结点
  63.             if (temp.getNext()==null){
  64.                 break;
  65.             }
  66.             //2 找到指定结点
  67.             if (temp.getNext().getGoodsId()==goodsNode.getGoodsId()){
  68.                 flag = true;
  69.                 break;
  70.             }
  71.             temp = temp.getNext();
  72.         }
  73.         if (flag){
  74.             //修改指定结点data域数据
  75.             temp.getNext().setGoodsName(goodsNode.getGoodsName());
  76.             temp.getNext().setGoodsPrice(goodsNode.getGoodsPrice());
  77.         }else {
  78.             throw new RuntimeException("未找到指定结点...");
  79.         }
  80.     }
  81.     /**
  82.      * 删除指定结点
  83.      * 根据结点ID删除指定结点
  84.      * @param goodsId
  85.      */
  86.     public void deleteNode(int goodsId){
  87.         //判断链表是否为空
  88.         if (node.getNext() == null){
  89.             throw new RuntimeException("该链表为空链表,不能进行删除操作...");
  90.         }
  91.         GoodsNode temp = node;  //头结点
  92.         boolean flag = false;   //是否做删除操作标识
  93.         //遍历链表结点 获取指定结点
  94.         while (true){
  95.             //遍历至最后一个结点 退出遍历
  96.             if (temp.getNext()==null){
  97.                 break;
  98.             }
  99.             //找到指定结点
  100.             if (temp.getNext().getGoodsId()==goodsId){
  101.                 flag = true;
  102.                 break;
  103.             }
  104.             temp = temp.getNext();
  105.         }
  106.         if (flag){
  107.             //删除操作
  108.             temp.setNext(temp.getNext().getNext());
  109.         }else {
  110.             throw new RuntimeException("未找到指定删除结点...");
  111.         }
  112.     }
  113.     /**
  114.      * 获取当前单链表的结点个数
  115.      * @return
  116.      */
  117.     public int lengthNode(){
  118.         int length = 0;
  119.         GoodsNode temp = node.getNext();
  120.         while (temp!=null){
  121.             length++;
  122.             temp = temp.getNext();
  123.         }
  124.         return length;
  125.     }
  126.     /**
  127.      * 查看链表元素
  128.      */
  129.     public void listNode(){
  130.         if (node.getNext()==null){
  131.             System.out.println("空链表...");
  132.         }else {
  133.             GoodsNode temp = node;
  134.             while (true){
  135.                 if (temp.getNext()==null){
  136.                     break;
  137.                 }
  138.                 temp = temp.getNext();
  139.                 System.out.println(temp);
  140.             }
  141.         }
  142.     }
  143. }
复制代码
3 双链表





  • 图书结点类
  1. package com.acti.linkedList;
  2. /**
  3. * author hongyeci
  4. * date 20220725
  5. * version 1.0
  6. * remark 双链表--图书类
  7. */
  8. public class BooksNode {
  9.     private int id;
  10.     private String name;
  11.     private double price;
  12.     private BooksNode pre; //双链表前驱结点
  13.     private BooksNode next; //双链表后继结点
  14.     public BooksNode() {
  15.     }
  16.     public BooksNode(int id, String name, double price) {
  17.         this.id = id;
  18.         this.name = name;
  19.         this.price = price;
  20.     }
  21.     public int getId() {
  22.         return id;
  23.     }
  24.     public void setId(int id) {
  25.         this.id = id;
  26.     }
  27.     public String getName() {
  28.         return name;
  29.     }
  30.     public void setName(String name) {
  31.         this.name = name;
  32.     }
  33.     public double getPrice() {
  34.         return price;
  35.     }
  36.     public void setPrice(double price) {
  37.         this.price = price;
  38.     }
  39.     public BooksNode getPre() {
  40.         return pre;
  41.     }
  42.     public void setPre(BooksNode pre) {
  43.         this.pre = pre;
  44.     }
  45.     public BooksNode getNext() {
  46.         return next;
  47.     }
  48.     public void setNext(BooksNode next) {
  49.         this.next = next;
  50.     }
  51.     @Override
  52.     public String toString() {
  53.         return "BooksNode{" +
  54.                 "id=" + id +
  55.                 ", name='" + name + '\'' +
  56.                 ", price=" + price +
  57.                 '}';
  58.     }
  59. }
复制代码

  • 带有头结点的双链表
  1. package com.acti.linkedList;
  2. /**
  3. * author hongyeci
  4. * date 20220725
  5. * version 1.0
  6. * remark 带有头结点的双链表
  7. */
  8. public class DoubleLinkedList {
  9.     private BooksNode head = new BooksNode(0,"头结点",0.0);
  10.     /**
  11.      * 增加结点-添加到末尾结点
  12.      * @param booksNode 图书结点
  13.      */
  14.     public void addNode(BooksNode booksNode){
  15.         BooksNode temp = head;
  16.         while(true){
  17.             if (temp.getNext() == null){
  18.                 break;
  19.             }
  20.             temp=temp.getNext();
  21.         }
  22.         temp.setNext(booksNode);
  23.         booksNode.setPre(temp);
  24.     }
  25.     /**
  26.      * 指定位置插入值
  27.      * 按照商品id值顺序插入到链表中
  28.      * @param booksNode
  29.      */
  30.     public void insertNode(BooksNode booksNode){
  31.         BooksNode temp = head;
  32.         boolean flag = false;
  33.         while(true){
  34.             if (temp.getNext() == null){
  35.                 break;
  36.             }
  37.             if (temp.getNext().getId()>booksNode.getId()){
  38.                 break;
  39.             }else if (temp.getId() == booksNode.getId()){
  40.                 flag = true;
  41.                 break;
  42.             }
  43.             temp=temp.getNext();
  44.         }
  45.         if (flag){
  46.             throw new RuntimeException("不能插入重复的商品...");
  47.         }else {
  48.             if (temp.getNext()==null){
  49.                 temp.setNext(booksNode);
  50.                 booksNode.setPre(temp);
  51.             }else {
  52.                 //1、当前结点的后继结点后继节点前驱指向新结点
  53.                 temp.getNext().setPre(booksNode);
  54.                 //2、新结点后继结点指向当前结点后继结点
  55.                 booksNode.setNext(temp.getNext());
  56.                 //3、新结点前驱结点指向当前结点
  57.                 booksNode.setPre(temp);
  58.                 //4、当前结点后继结点指向新结点
  59.                 temp.setNext(booksNode);
  60.             }
  61.         }
  62.     }
  63.     /**
  64.      * 修改指定结点data域信息
  65.      * @param booksNode
  66.      */
  67.     public void updateNode(BooksNode booksNode){
  68.         BooksNode temp = head;
  69.         if (temp.getNext() == null){
  70.             throw new RuntimeException("该双向链表为空链表,不能进行修改操作...");
  71.         }
  72.         boolean flag = false;
  73.         while (true){
  74.             //1 直到最后一个结点
  75.             if (temp.getNext()==null){
  76.                 break;
  77.             }
  78.             //2 找到指定结点
  79.             if (temp.getId()==booksNode.getId()){
  80.                 flag = true;
  81.                 break;
  82.             }
  83.             temp = temp.getNext();
  84.         }
  85.         if (flag){
  86.             //修改指定结点data域数据
  87.             temp.setName(booksNode.getName());
  88.             temp.setPrice(booksNode.getPrice());
  89.         }else {
  90.             throw new RuntimeException("未找到指定结点...");
  91.         }
  92.     }
  93.     /**
  94.      * 删除指定结点
  95.      * 根据结点ID删除指定结点
  96.      * @param id
  97.      */
  98.     public void deleteNode(int id){
  99.         BooksNode temp = head;  //头结点
  100.         //判断链表是否为空
  101.         if (temp.getNext() == null){
  102.             throw new RuntimeException("该链表为空链表,不能进行删除操作...");
  103.         }
  104.         boolean flag = false;   //是否做删除操作标识
  105.         //遍历链表结点 获取指定结点
  106.         while (true){
  107.             //遍历至最后一个结点 退出遍历
  108.             if (temp.getNext()==null){
  109.                 break;
  110.             }
  111.             //找到指定结点
  112.             if (temp.getId()==id){
  113.                 flag = true;
  114.                 break;
  115.             }
  116.             temp = temp.getNext();
  117.         }
  118.         if (flag){
  119.             //1、当前结点前驱结点的后继指向当前结点的后继结点
  120.             temp.getPre().setNext(temp.getNext());
  121.             //2、当前结点的后继结点前驱指向当前结点的前驱结点
  122.             if (temp.getNext()!=null){
  123.                 temp.getNext().setPre(temp.getPre());
  124.             }
  125.         }else {
  126.             throw new RuntimeException("未找到指定删除结点...");
  127.         }
  128.     }
  129.     /**
  130.      * 获取当前单链表的结点个数
  131.      * @return
  132.      */
  133.     public int lengthNode(){
  134.         int length = 0;
  135.         BooksNode temp = head.getNext();
  136.         while (temp!=null){
  137.             length++;
  138.             temp = temp.getNext();
  139.         }
  140.         return length;
  141.     }
  142.     /**
  143.      * 查看链表元素
  144.      */
  145.     public void listNode(){
  146.         if (head.getNext()==null){
  147.             System.out.println("空链表...");
  148.         }else {
  149.             BooksNode temp = head;
  150.             while (true){
  151.                 if (temp.getNext()==null){
  152.                     break;
  153.                 }
  154.                 temp = temp.getNext();
  155.                 System.out.println(temp);
  156.             }
  157.         }
  158.     }
  159. }
复制代码
4 单向环形链表-约瑟夫环

<ul>设编号为1,2,...,n的n个人围坐成一圈,约定编号为k(1=

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表