重温数据结构之双向链表:
package com.lin.link;
/**
* 类说明 :双向链表
*/
public class DoubleLinkedList {
// 节点类Node
private static class Node{
Object value;
Node prev=this;
Node next=this;
Node(Object v){
value=v;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return value.toString();
}
}
private Node head=new Node(null);// 头节点
private int size;// 链表大小
// 以下是接口方法
public boolean addFirst(Object o){
addAfter(new Node(o), head);
return true;
}
public boolean addLast(Object o){
addBefore(new Node(o), head);
return true;
}
public boolean add(Object o){
return addLast(o);
}
public boolean add(int index,Object o){
addBefore(new Node(o), getNode(index));
return true;
}
public boolean remove(int index){
removeNode(getNode(index));
return true;
}
public boolean removeFirst() {
removeNode(head.next);
return true;
}
public boolean removeLast() {
removeNode(head.prev);
return true;
}
public Object get(int index){
return getNode(index).value;
}
public int size(){
return size;
}
@Override
public String toString() {
StringBuffer stringBuffer=new StringBuffer("[");
Node node=head;
for(int i=0;i<size;i++){
node=node.next;
if(i>0)
stringBuffer.append(", ");
stringBuffer.append(node.value);
}
stringBuffer.append("]");
return stringBuffer.toString();
}
//以下是实现方法
private Node getNode(int index){
if(index<0||index>=size)
throw new IndexOutOfBoundsException();
Node node=head.next;
for (int i = 0; i < index; i++) {
node=node.next;
}
return node;
}
private void addBefore(Node newNode,Node node){
newNode.next=node;
newNode.prev=node.prev;
newNode.next.prev=newNode;
newNode.prev.next=newNode;
size++;
}
private void addAfter(Node newNode,Node node){
newNode.prev=node;
newNode.next=node.next;
newNode.next.prev=newNode;
newNode.prev.next=newNode;
size++;
}
private void removeNode(Node node){
node.prev.next=node.next;
node.next.prev=node.prev;
node.prev=null;
node.next=null;
size--;
}
public static void main(String[] args) {
DoubleLinkedList dll=new DoubleLinkedList();
//添加
dll.add("小明");
dll.add("小李");
dll.add("小红");
System.out.println(dll.size+" : "+dll);
//添加到最前
dll.addFirst("小芳");
System.out.println(dll.size+" : "+dll);
//添加到最后,同添加
dll.addLast("小王");
System.out.println(dll.size+" : "+dll);
//添加到指定位置
dll.add(4, "小林");
System.out.println(dll.size+" : "+dll);
//移除最前的
dll.removeFirst();
System.out.println(dll.size+" : "+dll);
//移除最后的
dll.removeLast();
System.out.println(dll.size+" : "+dll);
//移除指定位置上的
dll.remove(2);
System.out.println(dll.size+" : "+dll);
//返回指定位置上的元素
System.out.println(dll.get(1));
}
}