JS和Java实现链表类的基本功能
来源:互联网 发布:nba2k16卡顿优化补丁 编辑:程序博客网 时间:2024/05/15 19:51
综合网上实例
参考:
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)); } }
- JS和Java实现链表类的基本功能
- C++实现类似JAVA反射的基本功能
- JAVA用List实现Map的基本功能
- java--实现二叉树的一些基本功能
- pwd和clear 基本功能的实现
- 用ajax php html js mysql 实现博客的基本功能
- WINCE实现的基本功能
- wince实现的基本功能
- 串的基本功能实现
- Animation基本功能的实现
- ls基本功能的实现
- Java - - 数组实现栈基本功能
- C++实现shapefile文件的读写和基本功能的操作
- 链表的建立和一些基本功能的实现
- 服务器负载均衡的基本功能和实现原理
- 服务器负载均衡的基本功能和实现原理
- 服务器负载均衡的基本功能和实现原理
- 服务器负载均衡的基本功能和实现原理
- 黑马程序员_Java基础学习笔记2
- nginx+phpmyadmin
- 归并排序与逆序对的个数
- sicily 1050 Numbers & Letters
- 兎子产子(斐波那契数列)
- JS和Java实现链表类的基本功能
- python中easy_install工具的使用
- win7眼睛保护色设置方法
- windows上svn服务器的搭建
- 字符串匹配算法
- linux命令小记
- C++静态成员
- 自定义Flex4+的Spark组件part1:使用ActionScript3开发Spark组件Component类
- uva 10382 - Watering Grass