例1vxKHTML5中文学习网 - HTML5先行者学习网
代码如下 | |
package com.xlst.util;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 import java.util.HashMap;vxKHTML5中文学习网 - HTML5先行者学习网 import java.util.Map;vxKHTML5中文学习网 - HTML5先行者学习网 import java.util.UUID;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 双向循环链表vxKHTML5中文学习网 - HTML5先行者学习网 * 完成时间:2012.9.28vxKHTML5中文学习网 - HTML5先行者学习网 * 版本1.0vxKHTML5中文学习网 - HTML5先行者学习网 * @author xlstvxKHTML5中文学习网 - HTML5先行者学习网 *vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public class BothwayLoopLinked {vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 存放链表长度的 mapvxKHTML5中文学习网 - HTML5先行者学习网 * vxKHTML5中文学习网 - HTML5先行者学习网 * 如果简单使用 static int 型的 size 基本类型变量,则只能维护一个双向循环链表。vxKHTML5中文学习网 - HTML5先行者学习网 * 同时存在两个及以上双向循环链表时,数据会错乱vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 private static final Map<String, Integer> sizeMap = new HashMap<String, Integer>();vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 双向链表的 idvxKHTML5中文学习网 - HTML5先行者学习网 * 一个双向一个唯一的 idvxKHTML5中文学习网 - HTML5先行者学习网 * 根据这个id可以从 sizeMap 中取出当前链表的长度vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 private String linkedId = null;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 节点中的数据vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 private Object data = null;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 前一个节点(初始化时是自身)vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 private BothwayLoopLinked prev = this;vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 后一个节点(初始化时是自身)vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 private BothwayLoopLinked next = this;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 public BothwayLoopLinked(){}vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 在节点之后插入新节点vxKHTML5中文学习网 - HTML5先行者学习网 * @param newLinked 新插入的节点vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public void insertAfter(BothwayLoopLinked newLinked){vxKHTML5中文学习网 - HTML5先行者学习网 // 原来的前节点与后节点vxKHTML5中文学习网 - HTML5先行者学习网 BothwayLoopLinked oldBefore = this;vxKHTML5中文学习网 - HTML5先行者学习网 BothwayLoopLinked oldAfter = this.next;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 // 设置 newLinked 与原前节点的关系vxKHTML5中文学习网 - HTML5先行者学习网 oldBefore.next = newLinked;vxKHTML5中文学习网 - HTML5先行者学习网 newLinked.prev = oldBefore;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 // 设置 newLinked 与原后节点的关系vxKHTML5中文学习网 - HTML5先行者学习网 oldAfter.prev = newLinked;vxKHTML5中文学习网 - HTML5先行者学习网 newLinked.next = oldAfter;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 // 链表长度加一vxKHTML5中文学习网 - HTML5先行者学习网 changeSize(+1);vxKHTML5中文学习网 - HTML5先行者学习网 // 绑定新节点的 linkedIdvxKHTML5中文学习网 - HTML5先行者学习网 newLinked.linkedId = this.linkedId;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 在节点之前插入新节点vxKHTML5中文学习网 - HTML5先行者学习网 * @param newLinked 新插入的节点vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public void insertBefore(BothwayLoopLinked newLinked){vxKHTML5中文学习网 - HTML5先行者学习网 // 原来的前节点与后节点vxKHTML5中文学习网 - HTML5先行者学习网 BothwayLoopLinked oldBefore = this.prev;vxKHTML5中文学习网 - HTML5先行者学习网 BothwayLoopLinked oldAfter = this;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 // 设置 newLinked 与原前节点的关系vxKHTML5中文学习网 - HTML5先行者学习网 oldBefore.next = newLinked;vxKHTML5中文学习网 - HTML5先行者学习网 newLinked.prev = oldBefore;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 // 设置 newLinked 与原后节点的关系vxKHTML5中文学习网 - HTML5先行者学习网 oldAfter.prev = newLinked;vxKHTML5中文学习网 - HTML5先行者学习网 newLinked.next = oldAfter;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 // 链表长度加一vxKHTML5中文学习网 - HTML5先行者学习网 changeSize(+1);vxKHTML5中文学习网 - HTML5先行者学习网 // 绑定新节点的 linkedIdvxKHTML5中文学习网 - HTML5先行者学习网 newLinked.linkedId = this.linkedId;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 从链表结构中删除自身vxKHTML5中文学习网 - HTML5先行者学习网 * @return 被删除的节点vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public BothwayLoopLinked remove(){vxKHTML5中文学习网 - HTML5先行者学习网 return remove(this);vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 从链表结构中删除指定节点vxKHTML5中文学习网 - HTML5先行者学习网 * @param linked 要删除的节点vxKHTML5中文学习网 - HTML5先行者学习网 * @return 被删除的节点vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public BothwayLoopLinked remove(BothwayLoopLinked linked){vxKHTML5中文学习网 - HTML5先行者学习网 linked.prev.next = linked.next;vxKHTML5中文学习网 - HTML5先行者学习网 linked.next.prev = linked.prev;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 linked.prev = linked;vxKHTML5中文学习网 - HTML5先行者学习网 linked.next = linked;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 // 链表长度减一vxKHTML5中文学习网 - HTML5先行者学习网 changeSize(-1);vxKHTML5中文学习网 - HTML5先行者学习网 // 取消该节点的 linkedIdvxKHTML5中文学习网 - HTML5先行者学习网 this.linkedId = null;vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 // 返回被删除的节点vxKHTML5中文学习网 - HTML5先行者学习网 return linked;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 改变链表长度(默认长度加1),私有方法vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 private void changeSize(){vxKHTML5中文学习网 - HTML5先行者学习网 changeSize(1);vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 改变链表长度(根据参数),私有方法vxKHTML5中文学习网 - HTML5先行者学习网 * @param value 改变的长度值(可以为负数)vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 private void changeSize(int value){vxKHTML5中文学习网 - HTML5先行者学习网 if(this.linkedId == null){vxKHTML5中文学习网 - HTML5先行者学习网 this.linkedId = UUID.randomUUID().toString();vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 sizeMap.put(linkedId, 1 + value); // sizeMap.put(linkedId, 2);vxKHTML5中文学习网 - HTML5先行者学习网 }else{vxKHTML5中文学习网 - HTML5先行者学习网 Integer size = sizeMap.get(this.linkedId);vxKHTML5中文学习网 - HTML5先行者学习网 // Integer 是引用类型,更新值之后不必再 put 回 sizeMap 里vxKHTML5中文学习网 - HTML5先行者学习网 size += value;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 public Object getData() {vxKHTML5中文学习网 - HTML5先行者学习网 return data;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 public void setData(Object data) {vxKHTML5中文学习网 - HTML5先行者学习网 this.data = data;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 获取链表的长度vxKHTML5中文学习网 - HTML5先行者学习网 * 如果是新生的节点 或 从链表中删除的节点,则作为独立链表,长度是 1vxKHTML5中文学习网 - HTML5先行者学习网 * @return 链表的长度vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public int getSize() {vxKHTML5中文学习网 - HTML5先行者学习网 return (linkedId == null) ? 1 : sizeMap.get(this.linkedId);vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 public BothwayLoopLinked getPrev() {vxKHTML5中文学习网 - HTML5先行者学习网 return prev;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 public BothwayLoopLinked getNext() {vxKHTML5中文学习网 - HTML5先行者学习网 return next;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 |
例2vxKHTML5中文学习网 - HTML5先行者学习网
代码如下 | |
/**vxKHTML5中文学习网 - HTML5先行者学习网 * 双向循环链表测试vxKHTML5中文学习网 - HTML5先行者学习网 * @author GKTvxKHTML5中文学习网 - HTML5先行者学习网 * @param <E>vxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public class Node<E> vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 private E element; //结点数据vxKHTML5中文学习网 - HTML5先行者学习网 private Node<E> next; //上结点vxKHTML5中文学习网 - HTML5先行者学习网 private Node<E> previous; //下结点vxKHTML5中文学习网 - HTML5先行者学习网 private static int size=0; //链表长vxKHTML5中文学习网 - HTML5先行者学习网 //默认关结点next previous都是空,vxKHTML5中文学习网 - HTML5先行者学习网 public Node()vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 this.element=null;vxKHTML5中文学习网 - HTML5先行者学习网 this.next=null;vxKHTML5中文学习网 - HTML5先行者学习网 this.previous=null;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 private Node(E element,Node<E> next,Node<E> previous)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 this.element=element;vxKHTML5中文学习网 - HTML5先行者学习网 this.next=next;vxKHTML5中文学习网 - HTML5先行者学习网 this.previous=previous;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 尾部添加元素 evxKHTML5中文学习网 - HTML5先行者学习网 * @param evxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public void addAfter(E e)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 //定义新结点,next-->头结点;previous-->头结点.previous(尾结点)vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> newNode=new Node<E>(e,this,this.previous==null?this:this.previous);vxKHTML5中文学习网 - HTML5先行者学习网 //头结点next为空则让它指向newNodevxKHTML5中文学习网 - HTML5先行者学习网 if(this.next==null)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 this.next=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 //头结点previous为空则让它指向newNodevxKHTML5中文学习网 - HTML5先行者学习网 if(this.previous==null)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 this.previous=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 this.previous.next=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 this.previous=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 size++;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 头部添加元素 evxKHTML5中文学习网 - HTML5先行者学习网 * @param evxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public void addBefor(E e)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> newNode=new Node<E>(e,this.next==null?this:this.next,this);vxKHTML5中文学习网 - HTML5先行者学习网 if(this.next==null)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 this.next=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 if(this.previous==null)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 this.previous=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 this.next.previous=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 this.next=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 size++;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 在index处添加元素evxKHTML5中文学习网 - HTML5先行者学习网 * @param evxKHTML5中文学习网 - HTML5先行者学习网 * @param indexvxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public void add(E e,int index)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 //索引越界vxKHTML5中文学习网 - HTML5先行者学习网 if(index>=size || index<0)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 throw new IndexOutOfBoundsException("Node.get():"+index);vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 elsevxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 //index>size/2,反向遍历vxKHTML5中文学习网 - HTML5先行者学习网 if(index>size>>1)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> temp=this;vxKHTML5中文学习网 - HTML5先行者学习网 for(int i=size;i>index;i--)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 temp=temp.previous;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> newNode=new Node<E>(e,temp,temp.previous);vxKHTML5中文学习网 - HTML5先行者学习网 temp.previous.next=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 temp.previous=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 elsevxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> temp=this;vxKHTML5中文学习网 - HTML5先行者学习网 for(int i=0;i<=index;i++)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 temp=temp.next;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> newNode=new Node<E>(e,temp,temp.previous);vxKHTML5中文学习网 - HTML5先行者学习网 temp.previous.next=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 temp.previous=newNode;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 size++;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 删除第index个元素vxKHTML5中文学习网 - HTML5先行者学习网 * @param indexvxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public void remove(int index)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 //索引越界vxKHTML5中文学习网 - HTML5先行者学习网 if(index>=size || index<0)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 throw new IndexOutOfBoundsException("Node.get():"+index);vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 elsevxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 //index>size/2,反向遍历vxKHTML5中文学习网 - HTML5先行者学习网 if(index>size>>1)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> temp=this;vxKHTML5中文学习网 - HTML5先行者学习网 for(int i=size;i>index;i--)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 temp=temp.previous;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 temp.previous.next=temp.next;vxKHTML5中文学习网 - HTML5先行者学习网 temp.next.previous=temp.previous;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 elsevxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> temp=this;vxKHTML5中文学习网 - HTML5先行者学习网 for(int i=0;i<=index;i++)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 temp=temp.next;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 temp.previous.next=temp.next;vxKHTML5中文学习网 - HTML5先行者学习网 temp.next.previous=temp.previous;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 size--;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 /**vxKHTML5中文学习网 - HTML5先行者学习网 * 取得第index个元素vxKHTML5中文学习网 - HTML5先行者学习网 * @param indexvxKHTML5中文学习网 - HTML5先行者学习网 * @returnvxKHTML5中文学习网 - HTML5先行者学习网 */vxKHTML5中文学习网 - HTML5先行者学习网 public E get(int index)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 //索引越界vxKHTML5中文学习网 - HTML5先行者学习网 if(index>=size || index<0)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 throw new IndexOutOfBoundsException("Node.get():"+index);vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 elsevxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 //index>size/2,反向遍历vxKHTML5中文学习网 - HTML5先行者学习网 if(index>size>>1)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> temp=this;vxKHTML5中文学习网 - HTML5先行者学习网 for(int i=size;i>index;i--)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 temp=temp.previous;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 return temp.element;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 elsevxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 Node<E> temp=this;vxKHTML5中文学习网 - HTML5先行者学习网 for(int i=0;i<=index;i++)vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 temp=temp.next;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 return temp.element;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 public int size()vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 return size;vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 public static void main(String a[])vxKHTML5中文学习网 - HTML5先行者学习网 {vxKHTML5中文学习网 - HTML5先行者学习网 Node node=new Node();vxKHTML5中文学习网 - HTML5先行者学习网 node.addAfter("1");vxKHTML5中文学习网 - HTML5先行者学习网 node.addAfter("2");vxKHTML5中文学习网 - HTML5先行者学习网 node.addAfter("3");vxKHTML5中文学习网 - HTML5先行者学习网 node.addBefor("0");vxKHTML5中文学习网 - HTML5先行者学习网 node.add("7", 0);vxKHTML5中文学习网 - HTML5先行者学习网 System.out.println(node.get(0) );vxKHTML5中文学习网 - HTML5先行者学习网 System.out.println(node.get(1) );vxKHTML5中文学习网 - HTML5先行者学习网 System.out.println(node.get(2) );vxKHTML5中文学习网 - HTML5先行者学习网 System.out.println(node.get(3) );vxKHTML5中文学习网 - HTML5先行者学习网 System.out.println(node.get(4) );vxKHTML5中文学习网 - HTML5先行者学习网 vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 }vxKHTML5中文学习网 - HTML5先行者学习网 |
这两个链表最大的不同就是头结点是否是哑元,以及取出元素(get函数)的时候for循环变量i的不同:vxKHTML5中文学习网 - HTML5先行者学习网
双向循环链表(和java.util包的设计一样):由于head是哑元,因此取元素从head的下一个结点取vxKHTML5中文学习网 - HTML5先行者学习网
单向链表:head不是哑元,第一次必须取head头结点的元素,因此循环上和双向循环链表不同。也就是第一次get并没有进入for循环,直接返回了头结点,从第二次才开始进入for循环,这里要特别注意vxKHTML5中文学习网 - HTML5先行者学习网