双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
双向链表构造代码如下:
public class DoubleLinkedList {
private Node head; // 链表头
private Node tail; // 链表尾
private int size; // 链表的节点个数
private class Node {
private Object data;
private Node next;
private Node previous;
public Node(Object data) {
this.data = data;
}
}
public DoubleLinkedList() {
size = 0;
head = null;
tail = null;
}
// 在链表头增加节点
public void addHead(Object value) {
Node newNode = new Node(value);
if (size == 0) {
head = newNode;
tail = newNode;
size++;
} else {
head.previous = newNode;
newNode.next = head;
head = newNode;
size++;
}
}
// 在链表尾增加节点
public void addTail(Object value) {
Node newNode = new Node(value);
if (size == 0) {
head = newNode;
tail = newNode;
size++;
} else {
newNode.previous = tail;
tail.next = newNode;
tail = newNode;
size++;
}
}
// 删除链表头
public Node deleteHead() {
Node temp = head;
if (size != 0) {
head = head.next;
head.previous = null;
size--;
}
return temp;
}
// 删除链表尾
public Node deleteTail() {
Node temp = tail;
if (size != 0) {
tail = tail.previous;
tail.next = null;
size--;
}
return temp;
}
// 获得链表的节点个数
public int getSize() {
return size;
}
// 判断链表是否为空
public boolean isEmpty() {
return (size == 0);
}
// 从头开始显示节点信息
public void headdisplay() {
if (size > 0) {
Node node = head;
int tempSize = size;
if (tempSize == 1) {// 当前链表只有一个节点
System.out.println("[" + node.data + "]");
return;
}
while (tempSize > 0) {
if (node.equals(head)) {
System.out.print("[" + node.data + "->");
} else if (node.next == null) {
System.out.print(node.data + "]");
} else {
System.out.print(node.data + "->");
}
node = node.next;
tempSize--;
}
System.out.println();
}
else {// 如果链表一个节点都没有,直接打印[]
System.out.println("[]");
}
}
// 从尾开始显示节点信息
public void taildisplay() {
if (size > 0) {
Node node = tail;
int tempSize = size;
if (tempSize == 1) {// 当前链表只有一个节点
System.out.println("[" + node.data + "]");
return;
}
while (tempSize > 0) {
if (node.equals(tail)) {
System.out.print("[" + node.data + "->");
} else if (node.previous == null) {
System.out.print(node.data + "]");
} else {
System.out.print(node.data + "->");
}
node = node.previous;
tempSize--;
}
System.out.println();
}
else {// 如果链表一个节点都没有,直接打印[]
System.out.println("[]");
}
}
}
测试程序:
public static void Test_DoubleLinkedList(){
DoubleLinkedList list=new DoubleLinkedList();
list.headdisplay();
list.addHead("123");
list.headdisplay();
list.addTail("456");
list.headdisplay();
list.taildisplay();
list.addHead("789");
list.headdisplay();
list.deleteTail();
list.headdisplay();
}