鱼C论坛

 找回密码
 立即注册
查看: 689|回复: 0

[学习笔记] 单链表的遍历删除修改的实现

[复制链接]
发表于 2022-12-10 04:59:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 holistic杀手 于 2022-12-10 18:27 编辑

大家好,这是一个没有用索引完成的单向链表的部分功能(删除、修改、获取全部元素)的代码。感觉用索引会好一些,因为可能存在一个元素重复存储的情况。
  1. /*
  2. 单链表中的节点:
  3.     节点是单向链表中的基本的单元。
  4.     每一个节点Node都有两个属性。
  5.         一个属性:是存储的数据。
  6.         另一个属性:是下一个节点的内存地址。
  7. */
  8. public class Node<E> {
  9.     //数据
  10.     E element;

  11.     //下一个节点的内存地址
  12.     Node next;

  13.     public Node() {
  14.     }

  15.     public Node(E element, Node next) {
  16.         this.element = element;
  17.         this.next = next;
  18.     }
  19. }

  20. /*
  21. 链表类。(单向链表)
  22. */
  23. public class Link<E> {
  24.   
  25.     //头节点
  26.     private Node header;

  27.     private int size =0;

  28.     public int getSize(){
  29.         return size;
  30.     }


  31.     // 向链表中添加元素的方法(向末尾添加)
  32.     public void add(E data){
  33.     //public void add(Object data){
  34.         if (header == null){
  35.             // 说明还没有节点。
  36.             // new一个新的节点对象,作为头节点对象。
  37.             // 这个时候的头节点既是一个头节点,又是一个末尾节点。
  38.             header = new Node(data,null);
  39.         }else{
  40.             // 说明头不是空!
  41.             // 头节点已经存在了!
  42.             // 找出当前末尾节点,让当前末尾节点的next是新节点。
  43.             Node currentLastNode = findLast(header);
  44.             currentLastNode.next = new Node(data,null);
  45.         }
  46.         size++;
  47.     }

  48.     /**
  49.      * 专门查找末尾节点的方法。
  50.      * @param node 传进来的节点
  51.      * @return     传进来的节点的next为空,返回该节点;不为空进行递归,直到找到某个节点的next为空,返回该节点。
  52.      */
  53.     private Node findLast(Node node) {
  54.         // 如果一个节点的next是null
  55.         // 说明这个节点就是末尾节点
  56.         if (node.next==null){
  57.             return node;
  58.         }
  59.         //程序能够到这里说明:node不是末尾节点。
  60.         return findLast(node.next);//递归
  61.     }

  62.     // 删除链表中某个数据的方法****************
  63.     public void remove(E data){
  64.          Node node = contains(data,header);
  65.         if (node==null){
  66.             throw new ElementNotFoundException("ExceptionWarning:ElementNotFound!");
  67.         }else {
  68.             if (node==header){
  69.                 header =node.next;
  70.                 node.next =null;
  71.             }else if(node==findLast(header)){
  72.                 findprev(data,header).next=null;
  73.             }else {
  74.                 Node prevnode = findprev(data, header);
  75.                 prevnode.next = node.next;
  76.             }

  77.             size--;
  78.         
  79.         }

  80.     }

  81.     /**
  82.      * 找该节点的上一个节点
  83.     */
  84.     private Node findprev(E data,Node node) {
  85.         if (node.next.element == data){
  86.             return node;
  87.         }
  88.         return (findprev(data,node.next));
  89.     }

  90.     /*
  91.     看链表中是否包含该数据
  92.      */
  93.     private Node contains(E data,Node node) {
  94.         if (node.element==data){
  95.            return node;
  96.         }else if(node.next != null){
  97.             return contains(data,node.next);
  98.         }
  99.         return null;
  100.     }

  101.     //修改链表中某个数据的方法
  102.     public void modify(E olddata,E newdata) {
  103.         if (contains(olddata,header)==null){
  104.             throw new ElementNotFoundException("ExceptionWarning:ElementNotFound!");
  105.         }else{
  106.             contains(olddata,header).element=newdata;
  107.         }
  108.     }

  109.     //遍历***************
  110.     public void getAll(){
  111.         Node node = header;
  112.         while (node!=null){
  113.             System.out.println(node.element);
  114.             node=node.next;
  115.         }

  116.     }



  117. }

  118. class ElementNotFoundException extends RuntimeException{
  119.     public ElementNotFoundException(){}

  120.     public ElementNotFoundException(String s){
  121.         super(s);
  122.     }
  123. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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