基本概念
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。
代码
/**
* 链接点,相当于是车厢
*/
public class Node {
// 数据域
public long data;
//指针域(保存下一个节点的引用)
public Node next;
public Node(long value) {
this.data = value;
}
/**
* 显示方法
*/
public void display() {
System.out.print(data + " ");
}
}
/**
* 链表,相当于火车头
*/
public class LinkedList {
// 头结点
private Node first;
public LinkedList() {
first = null;
}
/**
* 插入一个节点,在头结点后进行插入
*
* @param value
*/
public void insertFirst(long value) {
Node node = new Node(value);
node.next = first;
first = node;
}
/**
* 删除一个结点
*
* @return
*/
public Node deleteFirst() {
Node tmp = first;
first = tmp.next;
return tmp;
}
/**
* 显示方法
*/
public void display() {
Node current = first;
while (current != null) {
current.display();
current = current.next;
}
}
/**
* 查找方法
*
* @param value
* @return
*/
public Node find(long value) {
Node current = first;
while (current.data != value) {
if (current.next == null) {
return null;
}
current = current.next;
}
return current;
}
public Node delete(long value) {
Node current = first;
Node previous = first;
while (current.data != value) {
if (current.next == null) {
return null;
}
previous = current;
current = current.next;
}
if (current == first) {
first = first.next;
} else {
previous.next = current.next;
}
return current;
}
}
测试
public class TestLinkedList {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.insertFirst(0);
linkedList.insertFirst(1);
linkedList.insertFirst(2);
linkedList.insertFirst(3);
linkedList.display();
linkedList.deleteFirst();
System.out.println();
linkedList.display();
System.out.println();
linkedList.find(2).display();
System.out.println();
linkedList.delete(0).display();
System.out.println();
linkedList.display();
}
}
结果
3 2 1 0
2 1 0
2
0
2 1