利用java实现 带有头节点 尾节点的双向链表,以及基本的方法实现
/**
* Created by pandap on 2017/8/4.
* 双向链表的java实现
*/
public class MyList<T> {
/*
内部节点类
*/
private class Node<T>{
public Node<T> pre;
public Node<T> next;
public T data;
public Node(){
this.data = null;
this.next = null;
this.pre = null;
}
public Node(T data,Node pre, Node next){
this.data = data;
this.pre = pre;
this.next = next;
}
}
//链表的属性 大小 头节点 尾节点
private int size;
private Node<T> header;
private Node<T> tail;
//初始化链表
public MyList(){
this.size = 0;
header = new Node<T>(null,null,null);
tail = new Node<T>(null,header,null);
header.next = tail;
if(header == null){
System.out.println("header is null");
}
if(tail == null){
System.out.println("tail isi null");
}
}
//添加元素
public void add(T item){
Node<T> newNode = new Node(item,null,null);
tail.pre.next = newNode;
newNode.pre = tail.pre;
newNode.next = tail;
tail.pre = newNode;
size++;
}
//判空
public boolean isEmpty(){
return size == 0;
}
public int size(){
return size;
}
//获取某个节点
public T get(int idx){
if(idx >= size || idx < 0){
throw new IndexOutOfBoundsException();
}
Node current = header;
for(int i=0; i<=idx; i++){
current = current.next;
}
return (T)current.data;
}
//输出链表
public void print(){
Node<T> current = header.next;
while(current.next != null){
System.out.println(current.data.toString());
current = current.next;
}
}
// 测试
public static void main(String[] args) {
MyList<String> strs = new MyList<String>();
strs.add("first");
strs.add("second");
strs.add("three");
System.out.println("size :" + strs.size);
strs.print();
System.out.println(strs.get(0));
}
}
测试结果