java 单向链表和双向链表
来源:互联网 发布:数据连接自动打开 编辑:程序博客网 时间:2024/05/16 08:17
java的单向链表~其实和c的链表思想差不多
package com.oracle.test;import java.util.Iterator;public class SingleLink implements Iterable{ private int size; private Node first;//首节点 /** * * 节点内部类 * */ private class Node{ Object data; Node next; public Node(Object data,Node next){ this.data=data; this.next=next; } } /** * 根据指定索引查找节点 * @param index * @return */ private Node node(int index){ Node c=first; for(int i=0;i<index;i++){ c=c.next; } return c; } /** * 添加方法 * @param obj */ public void add(Object obj){ Node newNode=new Node(obj,null); if(first==null){ first=newNode; }else{ Node last=node(size-1); last.next=newNode; } size++; } public Object get(int index){ this.checkIndex(index); return node(index).data; } public void del(int index){ this.checkIndex(index); Node last=node(index-1); last.next=last.next=last.next.next; size--; } /** * 检查下标是否正确的方法 * @param index */ private void checkIndex(int index){ if(index<0){ throw new IndexOutOfBoundsException("is negative number! "+index); } if(index>=size){ throw new IndexOutOfBoundsException("index out of bounds "+index); } } /** * 返回大小的方法 * @return */ public int size(){ return size; } private class Iter implements Iterator{ private Node cNode=first; private int cursor=0; @Override public boolean hasNext() { return cursor!=size; } @Override public Object next() { Object o=cNode.data; cNode=cNode.next; cursor++; return o; } } @Override public Iterator iterator() { return new Iter() ; } /** * 在指定位置插入一个新的节点 * @param obj */ public void insert(Object obj,int index){ this.checkIndex(index); if(index==0){ Node newNode=new Node(obj,first); first=newNode; }else{ Node target=node(index); Node newNode=new Node(obj,target); Node pre=node(index-1); pre.next=newNode; } size++; }}
测试:
package com.oracle.test;import java.util.Iterator;public class TestLink { public static void main(String[] args) { SingleLink sl=new SingleLink(); sl.add("aa"); sl.add("bb"); sl.add("cc"); for(int i=0;i<sl.size();i++){ System.out.println(sl.get(i)); } sl.insert("xxx",1); sl.del(2); //System.out.println(sl.get(2));// for(Object o:sl){// System.out.println(o);// } System.out.println("=========="); Iterator it=sl.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //System.out.println(sl.get(-100)); }}
运行截图:
其实双向链表没有改变都少,就是多加了一个向前的指针
package com.oracle.test;import java.util.Iterator;public class DoubleLink implements Iterable{ private int size; private Node first;//首节点 /** * * 节点内部类 * */ private class Node{ Object data; Node next; Node pre; public Node(Object data,Node next,Node pre){ this.data=data; this.next=next; this.pre=pre; } } /** * 根据指定索引查找节点 * @param index * @return */ private Node node(int index){ Node c=first; for(int i=0;i<index;i++){ c=c.next; } return c; } /** * 添加方法 * @param obj */ public void add(Object obj){ Node newNode=new Node(obj,null,null); if(first==null){ first=newNode; }else{ Node last=node(size-1); newNode.pre=last; newNode.next=last.next; last.next=newNode; } size++; } public Object get(int index){ this.checkIndex(index); return node(index).data; } public void del(int index){ this.checkIndex(index); Node last=node(index-1); last.next=last.next.next; size--; } /** * 检查下标是否正确的方法 * @param index */ private void checkIndex(int index){ if(index<0){ throw new IndexOutOfBoundsException("is negative number! "+index); } if(index>=size){ throw new IndexOutOfBoundsException("index out of bounds "+index); } } /** * 返回大小的方法 * @return */ public int size(){ return size; } private class Iter implements Iterator{ private Node cNode=first; private int cursor=0; @Override public boolean hasNext() { return cursor!=size; } @Override public Object next() { Object o=cNode.data; cNode=cNode.next; cursor++; return o; } } @Override public Iterator iterator() { return new Iter() ; } /** * 在指定位置插入一个新的节点 * @param obj */ public void insert(Object obj,int index){ this.checkIndex(index); if(index==0){ Node newNode=new Node(obj,first,null); first=newNode; }else{ Node target=node(index); Node newNode=new Node(obj,target,null); target.pre.next=newNode; newNode.pre=target.pre; target.pre=newNode; } size++; }}
测试代码跟单向的都是一样,结果也是一样。
0 0
- Java实现链表(单向和双向)
- java 单向链表和双向链表
- Java实现单向链表和双向链表
- java 单向和双向链表的详解
- 单向链表和双向链表
- 反转单向和双向链表简化
- [链表]-反转单向和双向链表
- Java实现单向双向链表原理分析
- 用c++实现单向链表和双向链表
- 数据结构 反转单向链表和双向链表
- 40.单向链表和双向链表
- 反转单向链表和反转双向链表
- 【C】单向链表和双向链表的插入
- 链表问题---反转单向和双向链表
- 反转单向链表和反转双向链表
- Java模拟单向链表和双向链表的实现
- Java模拟单向链表和双向链表的实现
- Java 之 模拟单向链表和双向链表的实现
- UIView-iOS-Apple官方文档翻译注释总结
- MySQl中文乱码的问题
- 签到
- git 大小写问题解决
- js控制表单提交带参数
- java 单向链表和双向链表
- Laravel大量数据库查询导致php进程内存耗尽
- webserveice搭建
- Java面试题大全(Java基础五)
- Android应用程序窗口(Activity)的运行上下文环境(Context)的创建过程分析
- Filebeat的架构分析、配置解释与示例
- jquery实现高度的获取-位置函数
- 64bit ubuntu安装arm交叉工具链问题汇总
- 临界区锁 InitializeCriticalSection()--- EnterCriticalSection()--LeaveCriticalSection()