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

本文介绍了使用JavaScript和Java两种语言实现链表的数据结构方法。包括链表节点的定义、基本操作如添加、查找、删除等,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

综合网上实例

参考:

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

http://m.blog.youkuaiyun.com/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));   
    }
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值