2、双端链表
双端链表就是在单链表的基础上增加一个尾节点,使链表既有头节点又有尾节点,这样方便进行链表尾的访问和删除。其计算复杂度如下:1、在表头插入一个新的节点,时间复杂度O(1) ;2、在表尾插入一个新的节点,时间复杂度O(1) ;3、删除表头的节点,时间复杂度O(1) ;4、删除表尾的节点,由于只保存了表尾的节点,而没有保存表尾的前一个节点(单向,只能从前往后推),所以在删除表尾节点时需要遍历以找到表尾节点的前一个节点,需查找N-1次,也就是O(N)。
其实现代码如下:
public class DoublePointLinkedList {
private Node head;// 头节点
private Node tail;// 尾节点
private int size; // 节点的个数
private class Node {
private Object data;
private Node next;
public Node(Object data) {
this.data = data;
}
}
public DoublePointLinkedList() {
size = 0;
head = null;
tail = null;
}
// 链表头新增节点
public void addHead(Object data) {
Node node = new Node(data);
if (size == 0) { // 如果链表为空,那么头节点和尾节点都是该新增节点,节点个数加1
head = node;
tail = node;
size++;
} else { // 如果链表不为空,那么原有头节点成为下一个节点,新节点成为头节点,尾节点不变,节点个数加1
node.next = head;
head = node;
size++;
}
}
// 链表尾新增节点
public void addTail(Object data) {
Node node = new Node(data);
if (size == 0) {// 如果链表为空,那么头节点和尾节点都是该新增节点,节点个数加1
head = node;
tail = node;
size++;
} else { // 如果链表不为空,那么新节点成为下一个节点,新节点成为尾节点,节点个数加1
tail.next = node;
tail = node;
size++;
}
}
// 删除头部节点,成功返回true,失败返回false
public boolean deleteHead() {
if (size == 0) {// 当前链表节点数为0
return false;
}
if (head.next == null) {// 当前链表节点数为1
head = null;
tail = null;
size--;
return true;
} else { // 当前节点数大于1,头节点称为头节点的下一个节点
head = head.next;
size--;
return true;
}
}
// 判断是否为空
public boolean isEmpty() {
return (size == 0);
}
// 获得链表的节点个数
public int getSize() {
return size;
}
public Object getHead(){
return head.data;
}
public Object getTail(){
return tail.data;
}
// 显示节点信息
public void display() {
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("[]");
}
}
}
测试代码如下:
private static void DoublePointLinkedListTest() {
DoublePointLinkedList list=new DoublePointLinkedList();
System.out.println(list.getSize());
list.addHead("123");
System.out.println(list.getSize());
list.display();
list.addTail("456");
list.display();
System.out.println(list.getHead());
System.out.println(list.getTail());
list.addHead("789");
list.display();
}