/***
*
* MyLinkList 双向列表
*
*
*@authoryangkj
*@version*@since2016年8月15日*/
public classMyLinkList {/*** 首节点*/
privateNode firstNode;/*** 尾节点*/
privateNode lastNode;/*** 节点个数*/
private intsize;publicMyLinkList() {super();
}/*** 添加节点
*
*@paramobj*/
public voidadd(Object obj) {if (firstNode == null) {//如果链表为空,则设置当前对象为首节点,同时也是尾节点;且该节点的前一节点和后一节点都为null
Node node = new Node(null, obj, null);
firstNode=node;
lastNode=node;
}else{//直接在lastNode后面添加新的节点
Node node = new Node(lastNode, obj, null);//旧的尾节点的下一个节点指向新加节点
lastNode.setNext(node);//链表的尾节点设成新加节点
lastNode =node;
}
size++;
}/*** 指定索引位置上插入节点
*
*@paramindex
*@paramobj*/
public void add(intindex, Object obj) {
Node temp=node(index);if (temp != null) {
Node up=temp.previous;
Node newNode= newNode(up, obj, temp);
up.setNext(newNode);
temp.setPrevious(newNode);
size++;
}
}/*** 获取指定节点对象
*
*@paramindex
*@return
*/
public Object get(intindex) {
Node temp=node(index);if (temp != null) {returntemp.obj;
}else{return null;
}
}/*** 越界检测
*
*@paramindex*/
private void rangCheck(intindex) {if (index < 0 || index >size) {throw newArrayIndexOutOfBoundsException(index);
}
}/*** 移除指定索引 的节点
*
*@paramindex*/
public void remove(intindex) {//越界检测
Node temp =node(index);if (temp != null) {
Node up=temp.previous;
Node down=temp.next;
up.next=down;
up.previous=up;
temp= null;
size--;
}
}/*** 获取指定索引下的节点
*
*@paramindex
*@return
*/
private Node node(intindex) {
rangCheck(index);
Node temp= null;if (firstNode != null) {
temp=firstNode;for (int i = 0; i < index; i++) {
temp=temp.next;
}
}returntemp;
}/*** 设置指定索引的值
*@paramindex
*@paramobj*/
public void set(intindex,Object obj){
rangCheck(index);
Node temp=node(index);if(temp!=null){
temp.setObj(obj);
}
}/*** 获得链表长度
*
*@return
*/
public intsize() {returnsize;
}public static voidmain(String[] args) {
MyLinkList linkList= newMyLinkList();
linkList.add("aaa");
linkList.add("bbb");
linkList.add("ccc");
System.out.println(linkList.get(1));
linkList.set(1, "fff");
System.out.println(linkList.get(1));
}
}