java实现双向链表
2016-05-21 10:37
706 查看
public class DoubleLinkList { private Node head; //链表头结点 private Node tail; //链表尾结点 int size=1; //初始化链表 public DoubleLinkList(int data) { // TODO Auto-generated constructor stub head=new Node(null, 1, null); tail=head; } //链表是否为空 public boolean isEmpty() { return size==0; } //获得双向链表的长度 public int getSize() { return size; } //获得指定位置的节点,index从0开始 计算 public Node getNode(int index) { if (index<0||index>size-1) { throw new IndexOutOfBoundsException("索引越界"); }else { int a=0; Node current=head; while (index!=a) { current=current.next; a++; } //结束循环后current 指向index位置的节点 return current; } } //获得指定位置节点的数据 public int getData(int index) { return getNode(index).data; } //在链表的头部位置插入节点 public void addHeadData(int data) { Node node=new Node(null, data, this.head); this.head.pre=node; this.head=node; if (tail==null) { this.head=tail; } size++; } //在尾部位置插入节点 public void addTailData(int data) { if (head==null) { head=new Node(null, data, null); this.tail=this.head; }else { Node node =new Node(tail, data, null); tail.next=node; tail=node; } size++; } //在指定位置插入节点 public void addData(int index ,int data) { if (index<0||index>size) { throw new IndexOutOfBoundsException("索引越界"); }else { if (head==null) { this.addTailData(data); //尾部插入 }else { if (index==0) { this.addHeadData(data); }else { Node node=this.getNode(index-1); //要先找到插入的前一个节点 Node current=node.next; Node newNode=new Node(node, data, current); //newNode.pre=node,newNode.next=current; node.next=newNode; current.pre=newNode; size++; } } } } //删除尾结点 public void deleteTail() { Node node=this.getNode(size-2); Node current=node.next; //要删除的节点 node.next=current.next; current.next=null; current.pre=null; size--; } //删除指定位置节点 public void delete(int index) { //System.out.println(size-1); if (index<0||index>size-1) throw new IndexOutOfBoundsException("索引越界"); //删除的是头结点 if (index==0) { Node current=head; this.head=head.next; this.head.pre=null; size--; }else { Node node=this.getNode(index-1); Node current=node.next; //要删除的节点 node.next=current.next; if (current.next!=null) //如果是尾结点 current.next.pre=node; else { current.next=null; current.pre=null; size--; } } } //正向打印链表 public void print() { for(Node node=head;node!=null;node=node.next) { System.out.print(node.data +" "); } System.out.println(); } //反向打印链表 public void reversePrint() { for (Node node=tail;node!=null;node=node.pre) { System.out.print(node.data+" "); } System.out.println(); } //链表的结点类 class Node{ int data; Node pre; Node next; public Node(Node pre,int data,Node next) { // TODO Auto-generated constructor stub this.pre=pre; this.data=data; this.next=next; } } public static void main(String[] args) { // TODO Auto-generated method stub DoubleLinkList list=new DoubleLinkList(1); for (int i=0;i<6;i++) { list.addTailData(i); } System.out.println("正向打印链表"); list.print(); System.out.println("插入头结点后打印链表"); list.addHeadData(20); list.print(); System.out.println("插入尾结点后打印链表"); list.addTailData(30); list.print(); list.addData(2, 10); System.out.println("插入数据后正向打印链表"); list.print(); list.delete(0); System.out.println("删除头结点后正向打印链表 "); list.print(); list.deleteTail(); System.out.println("删除尾结点后正向打印链表 "); list.print(); list.delete(3); System.out.println("删除索引为3的数据后打印链表"); list.print(); //list.reversePrint(); } }
结果
正向打印链表
1 0 1 2 3 4 5
插入头结点后打印链表
20 1 0 1 2 3 4 5
插入尾结点后打印链表
20 1 0 1 2 3 4 5 30
插入数据后正向打印链表
20 1 10 0 1 2 3 4 5 30
删除头结点后正向打印链表
1 10 0 1 2 3 4 5 30
删除尾结点后正向打印链表
1 10 0 1 2 3 4 5
删除索引为3的数据后打印链表
1 10 0 2 3 4 5
相关文章推荐
- 记忆化搜索路径_Java实现
- JAVA——Runtime对象
- JavaWeb的学习总结(三)— 过滤器(Filter)
- Struts2之文件上传与下载
- Java技术大牛之路
- Eclipse常用快捷键
- eclipse properties 插件
- eclipse properties 插件
- 基础Java语言编程练习题
- java中使用containsKey实现的group by功能
- 如何让eclipse进行智能提示?
- Java--static关键字
- spring初学碰到的问题(一)
- Java千百问_01基本概念(006)_线程和进程有什么区别
- 利用java调用百度API接口,解析返回的json数据,突破百度API接口调用结果的限制
- 攻破JAVA NIO技术壁垒
- java容器:Collection中的Iterator和Map中的entrySet对比学习
- Spring Boot Admin Reference Guide
- Spring Boot Admin Reference Guide
- 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 (转)