JS和Java实现链表类的基本功能

2023-11-12

综合网上实例

参考:

http://www.2cto.com/kf/201204/126773.html JavaScript实现参考

http://m.blog.csdn.net/blog/caiwenfeng_for_23/8496029 Java实现参考


JS实现

function linkNode(_key, _value){   // 链表类的节点类    
     this.Key = _key;    
     this.Value = _value;   
     this.next = null;
}
function Link(){    /// 创建一个链表类    
     this.root = new linkNode(null, null); //root永远是个空节点    
     this.end = this.root;
}

Link.prototype ={    
     count: 0,    
     value: function (_key)    {        /// 根据key的值来获取value值       
     var i = this.root;        
     while (Boolean(i = i.next)) {            
          if (i.Key == _key)         
               return i.Value;      
          }   
     },    
     add: function (_key, _value){        /// 往链表的尾部中加入一个节点        
     var i = this.root;        
     while (Boolean(i = i.next)){            
         if (i.Key == _key)               
              return i.Value = _value;        
     }       
     var node = new linkNode(_key, _value);        
     if (this.count == 0)            
         this.root.next = node;       
     else           
         this.end.next = node;       
     this.end = node;       
     this.count++;        
     return _value;    
     },   
     insert: function (_key, node){        /// 从链表类的某节点之后插入新节点node.       
     var i = this.root;        
     while (Boolean(i = i.next)){            
         if (i.Key == _key)  {               
               var tmp = i.next;    
               i.next = node;                
               node.next = tmp;
               break;            
         }        
     }    
    },    
     insertBefore: function (_key, node) {        /// 从链表类的某节点之后插入新节点node.        
            var i = this.root;        
            while (Boolean(i = i.next)){            
                  if (i.next.Key == _key){                
                      var tmp = i.next;               
                      i.next = node;               
                      node.next = tmp;               
                      break;            
                 }        
            }    
      },    
     remove: function (_key){        /// 从链表类中移除一个key       
           var i = this.root;        
           do {           
               if (i.next.Key == _key) {         
                   if (i.next.next == null)     
 
                     this.end = i;               
                     i.next = i.next.next;
                     this.count--;                
                     return;            
            }       
    } while (Boolean(i = i.next))   
   },    
   exists: function (_key){        /// 检查链表类中是否存在一个key       
        var i = this.root;        
        while (Boolean(i = i.next))            
        if (i.Key == _key)              
               return true;      
        return false;    },   
  removeAll: function (){        /// 清空链表类       
        this.root = new linkNode(null, null);        
        this.end = this.root;       
        this.count = 0;    
   },   

   Obj2str: function (o) {       
        if (o == undefined) 
        {           
              return "";       
         }        
         var r = [];        
        if (typeof o == "string")            
           return "\"" + o.replace(/([\"\\])/g, "\\$1").replace(/(\n)/g, "\\n").replace(/(\r)/g, "\\r").replace(/(\t)/g, "\\t") + "\"";        if (typeof o == "object")        {            if (!o.sort)            {                for (var i in o)                    r.push("\"" + i + "\":" + this.Obj2str(o[i]));                r = "{" + r.join() + "}";            }            else{                for (var i = 0; i < o.length; i++)                    r.push(this.Obj2str(o[i]))                r = "[" + r.join() + "]";            }            return r;        }        return o.toString().replace(/\"\:/g, '":""');    },    getJSON: function ()    {        /// 转换成JSON字符串        var me = this;        var getChild = function (node){            var str = "";            str += "{\"Key\":\"" + node.Key + "\",\"Value\":" + me.Obj2str(node.Value);            if (node.next != null)                str += ",\"next\":" + getChild(node.next);            else                str += ",\"next\":\"null\"";            str += "}";            return str;        };        var link = "{\"root\":{\"Key\":\"null\",\"Value\":\"null\",\"next\":";        if (this.count == 0)//如果空表        {            return "{\"root\":{\"Key\":\"null\",\"Value\":\"null\",\"next\":\"null\"},\"end\":{\"Key\":\"null\",\"Value\":\"null\",\"next\":\"null\"},\"count\":\"0\"}";        }        link += getChild(this.root.next) + "}";        //加上end        link += ",\"end\":{\"Key\":\"" + this.end.Key + "\",\"Value\":" + me.Obj2str(this.end.Value) + ",\"next\":\"null\"";        link += "},\"count\":\"" + this.count + "\"}";        return link;    },    getArrayJSON: function (){        /// 转所有节点的value换成JSON字符串,数组格式        var link = "{\"link\":[";        var i = this.root;        while (Boolean(i = i.next)){            link += this.Obj2str(i.Value) + ",";        }        link = link.substr(0, link.length - 1);        link += "]}";        return link;    },    sort: function (fn){        /// 对链表进行排序       /// 比较两个链表元素大小的方法,当返回真时,此方法的参数所指的节点将往下沉        if (fn != null){            var i = this.root;            while (Boolean(i = i.next)){                var j = this.root;                while (Boolean(j = j.next)){                    if (j.next != null) {                        if (fn.call(this, j)){                            var Key = j.Key;                            var Value = j.Value;                            j.Key = j.next.Key;                            j.Value = j.next.Value;                            j.next.Key = Key;                            j.next.Value = Value;                        }                    }                }                this.end = i;            }        }        else {
        }    
}};

Java实现

public class LinkList<T> {    
      public class Node{  //定义节点       
           private T data;       
           private Node next;       
           public Node(){          
            }        
           public Node(T data,Node next){            
               this.data=data;            
               this.next=next;       
           }    
    }   
    private Node header;//头节点    
    private Node tail;//尾节点    
     private int size;//链表大小
    //构造函数初始化数据   
    public LinkList(){       
        header=null;        
        tail=null;   
    }    
    public LinkList(T element){      
         header=new Node(element,null);       
         tail=header;       
          size++;    }   
    //链表长度   
     public int length(){        
            return size;   
    }    
    //返回指定位置index的节点    
    public T get(int index){      
            return getNodeByIndex(index).data;    
    }    
    private Node getNodeByIndex(int index) {        
           if(index<0||index>size-1){           
                 throw new IndexOutOfBoundsException("线性表索引越界");        
           }       
           Node current=header;       
           for(int i=0;i<size&¤t!=null;i++,current=current.next){            
                 if(i==index){    
                         return current;           
                  }       
           }     
            return null;   
     }
    //返回element在链表的位置,-1表示不存在  
    public int locate(T element){        
           Node current=header;       
           for(int i=0;i<size&¤t!=null;i++,current=current.next){            
                  if(current.data==element){               
                              return i;          
                  }        
           }       
          return -1;  
     }
    //在index位置插入节点element
    public void insert(T element,int index){
        if(index<0||index>size){
            throw new IndexOutOfBoundsException("线性表索引越界");
        }
        if(header==null){
            add(element);
        }else{
            if(index==0){
                addAtHeader(element);
            }else{
                Node prev=getNodeByIndex(index-1);
                prev.next=new Node(element,prev.next);
                size++;
            }
        }
    }
    
  //采用尾插法为链表添加新节点    private void add(T element) {        if(header==null){
            header=new Node(element,null);
            tail=header;
        }else{
            Node newNode=new Node(element,null);
            tail.next=newNode;
            tail=newNode;
        }
        size++;
    }
    
    //采用头插法为链表添加新节点
    private void addAtHeader(T element){
        header=new Node(element,header);
        if(tail==null){
            tail=header;
        }
        size++;
    }
    
    //删除index位置的节点
    public T delete(int index){
        if(index<0||index>size-1){
            throw new IndexOutOfBoundsException("线性表索引越界");
        }
        Node del=null;
        if(index==0){
            del=header;
            header=header.next;
        }else{
            Node prev=getNodeByIndex(index-1);
            del=prev.next;
            prev.next=del.next;
            del.next=null;
        }
        size--;
        return del.data;
    }
    
    //从链表后面删除一个节点
    public T remove(){
        return delete(size-1);
    }
    
    //是否为空
    public boolean empty(){
        return size==0;
    }
    //清空链表
    public void clear(){
        header=null;
        tail=null;
        size=0;
    }
    
    public String toString(){
        if(empty()){
            return "[]";
        }else{
            StringBuilder sb=new StringBuilder("[");
            for(Node current=header;current!=null;current=current.next){
                sb.append(current.data.toString()+", ");
            }
            int len=sb.length();
            return sb.delete(len-2, len).append("]").toString();
        }
    }
    public static void main(String[] args) {       
          LinkList<String> list=new LinkList<String>();      
          list.insert("aaa", 0);        
          list.add("bbb");       
          list.add("ccc");       
          System.out.println(list.toString());        
          list.insert("ddd", 1);       
          System.out.println(list.toString());     
           list.delete(2);       
           System.out.println(list.toString());       
           System.out.println("ccc在链表中的位置:"+list.locate("ccc"));       
           System.out.println("链表中索引2处的元素:"+list.get(2));   
    }
 }


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS和Java实现链表类的基本功能 的相关文章

  • 如何在 Spring Data 中选择不同的结果

    我在使用简单的 Spring Data 查询或 Query 或 QueryDSL 在 Spring Data 中构建查询时遇到问题 如何选择三列 研究 国家 登录 不同的行 并且查询结果将是用户对象类型的列表 Table User Id S
  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 使用 JUnit 时,有没有办法验证测试方法中是否调用了 try/catch 指令的 Catch 部分?

    例如 如果我想测试以下课程 public class SomeClass public void someMethod try Some code where comething could go wrong catch Exception
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • 如何在 Java 中创建接受多个值的单个注释

    我有一个名为 Retention RetentionPolicy SOURCE Target ElementType METHOD public interface JIRA The Key Bug number JIRA referenc
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • Google Pixel 3玩机教程

    说到谷歌的亲儿子Pixel系列 你一定就会想到安卓原生系统 现在我将会教你如何使用pixel去root并且破解电信 第一步 解锁手机 1 打开手机的开发者选项 选择OEM解锁 打开它 再把USB调试打开 2 在电脑上的google deve
  • GPIO的开漏和推挽

    GPIO的开漏和推挽 简单来说推挽输出可以自由输出高低电平 开漏输出只能在关闭时配合上拉提高高电平 打开时漏掉电流形成低电平 操作单片机点亮一个LED的时候我们需要操作GPIO输出一个高电平来点亮一个LED 当我们打开用户手册时会发现GPI
  • OR-Tool 报INFEASIBLE

    OR Tool 使用Minimum Cost Flows报 There was an issue with the min cost flow input Status Status INFEASIBLE 这是因为node的编号需要是连续的
  • 肺炎疫情攻防战--肺炎X光病灶识别 Pytorch baseline

    肺炎疫情攻防战 肺炎X光病灶识别 Pytorch baseline 刚从Keras转Pytorch没多久 一边看着文档一边Google完成这比赛的baseline 比赛地址 比赛简介 本次由2019 nCoV病毒引发的肺炎疫情仍在持续 AI
  • 使用Hugging Face管道轻松应用NLP预训练模型

    这一段时间在研究自然语言处理 一直想找一些预训练模型 发现这个非常全 就收藏好好研究 作者 Robin van Merle 编译 VK 来源 Towards Data Science 原文链接 https towardsdatascienc
  • VMware中NET模式无法获取IP地址

    0x00 打开我的kali尝试运行脚本时 发现无论是桥接还是NET都无法获取到IP地址 经过各种百度以及尝试 最终解决 因此在此写下文章来记录一下 如果你也遇到相同问题 希望可以帮助到你 0x01 先看一下在NET下无法获取到地址的情况 此
  • react-create-app 基于 react-app-rewired scss设置全局变量全局函数

    目录 重写react脚手架配置 使用 scss 引用全局 scss 文件中的变量和函数应用全局 测试 重写react脚手架配置 customize cra 合并配置 react app rewired 重写react脚手架配置 安装依赖 n
  • 镜头桶形失真校正算法

    短焦镜头通常会产生桶形失真 以下是校正算法的matlab代码 cpp view plain copy 镜头桶形失真校正 短焦镜头 img origin1 imread Still001 bmp img origin rgb2gray img
  • day01fs模块

    一 文件操作 一 文件删除 1 异步 fs unlink path callback fs unlink hello txt err gt console lo err 回调函数参数err返回错误信息或者null 2 同步 fs unlin
  • 计算机enter代表什么意思,enter是什么意思

    手机评站网今天精心准备的是 enter是什么意思 下面是详解 电脑上键盘上enter是什么意思 在电脑键盘上带有 Enter 字样并有一弯箭头的按键 被叫做 回车键 其形状如下图所示 其位置在引号键的右边 另一个位置在数字键盘的右下角 在文
  • vue结合Waterfall做图片瀑布流展示

    一 安装Waterfall npm install vue waterfall plugin s 二 在组件中引入并使用
  • winform 程序的配置文件——App.config

    winform 程序的配置文件 App config Posted on 2005 09 26 17 11 sashow 阅读 668 评论 3 编辑 收藏 引用 网摘 所属分类 c 编程 在做 web 项目的时候 我一直在用 web co
  • 机器学习——1.Sklearn:特征工程

    目录 scikit learn数据集API介绍 sklearn小数据集 sklearn大数据集 sklearn数据集的使用 数据集的划分 特征工程 特征抽取 特征提取 特征提取API 字典特征提取 文本特征提取 中文文本特征值抽取 停用词
  • 线程池和连接池

    线程池 1 流程 先启动若干数量的线程 并让这些线程都处于睡眠状态 当客户端有一个新请求时 就会唤醒线程池中的某一个睡眠线程 让它来处理客户端的这个请求 当处理完这个请求后 线程又处于睡眠状态 2 作用 线程池作用就是限制系统中执行线程的数
  • Android MD5加密算法

    Android MD5加密算与J2SE平台一模一样 因为Android 平台支持 java security MessageDigest这个包 实际上与J2SE平台一模一样 算法签名 String getMD5 String val thr
  • IDEA连接MySQL

    今天使用IDEA连接MySQL时 遇到了很多问题 寻找了一个多小时终于把解决了 写篇博客记录记录 帮后来人节约时间 首先是参照其他帖子不断寻找Database视图 找了小半天才发现这个在IDEA中社区版是没有的 需要下载IDEA 的Ulti
  • 【allegro 17.4软件操作保姆级教程一】软件操作环境设置

    文中截图为16 6的软件截图 16 6与17 4的操作逻辑基本相同 大家无需担心 后续文章会使用17 4的截图 1操作环境准备1 1单位设置 可以将全局单位设置为mil 精度改为2位 也可以设置为mm 这时精度改为4位 这个根据习惯而定 操
  • PyTorch学习笔记(21) ——损失函数

    0 前言 本博客内容翻译自纽约大学数据科学中心在2020发布的 Deep Learning 课程的Activation Functions and Loss Functions 部分 废话不多说 下面直接开始吧 1 损失函数 本文是PyTo
  • 在Unity开发中使用 Rider

    Unity开发中使用Rider 环境 Windows Unity 2017 JetBrains Rider 2018 3 4 作为Windows和Visual Studio的拥趸 我是多么推崇Visual Studio 开发Unity使用
  • JS和Java实现链表类的基本功能

    综合网上实例 参考 http www 2cto com kf 201204 126773 html JavaScript实现参考 http m blog csdn net blog caiwenfeng for 23 8496029 Jav