一、链表介绍
链表是由一系列非连续的节点组成的存储结构,链表是一种递归的数据结构,它或者为空,或者是指向一个结点的引用,该结点含有一个泛型的元素和一个指向另一个结点的引用。
分类:简单分下类的话,链表又分为单向链表和双向链表,而单向/双向链表又可以分为循环链表和非循环链表,下面简单就这四种链表进行图解说明。
1、单向链表
单向链表就是通过每个结点的指针指向下一个结点从而链接起来的结构,最后一个节点的next指向null。
2、单向循环链表
单向循环链表和单向列表的不同是,最后一个节点的next不是指向null,而是指向head节点,形成一个“环”。
3、双向链表
从名字就可以看出,双向链表是包含两个指针的,pre指向前一个节点,next指向后一个节点,但是第一个节点head的pre指向null,最后一个节点的tail指向null。
4、双向循环链表
双向循环链表和双向链表的不同在于,第一个节点的pre指向最后一个节点,最后一个节点的next指向第一个节点,也形成一个“环”。而LinkedList就是基于双向循环链表设计的。
二、链表结点的实现
/**
* 链表的节点
* @author hoaven
*/
public class Node<T> {
public Node<T> next;
public T data;
public Node(T _data){
data = _data;
}
}
三、链表的简单操作
/**
* 删除链表中重复的元素
*
* @author hoaven
*
*/
public class DeleteDups {
public static void delete(Node<Integer> head) {
if (head == null)
return;
Node<Integer> current = head;
while (current != null) {
Node<Integer> runner = current;
while (runner.next != null) {
if (runner.next.data == current.data) {
//建立新桥
runner.next = runner.next.next;
} else {
runner = runner.next;
}
}
current = current.next;
}
}
/**
* @param args
*/
public static void main(String[] args) {
//初始化链表
Node<Integer> node1 = new Node<Integer>(2);
Node<Integer> node2 = new Node<Integer>(2);
Node<Integer> node3 = new Node<Integer>(3);
Node<Integer> node4 = new Node<Integer>(4);
Node<Integer> node5 = new Node<Integer>(4);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
Node<Integer> head = node1;
while (node1 != null) {
System.out.print(node1.data + " ");
node1 = node1.next;
}
System.out.println("\r\nDelete dups");
delete(head);
node1 = head;
while (node1 != null) {
System.out.print(node1.data + " ");
node1 = node1.next;
}
}
}