链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
链表可分为单向链表和双向链表。
一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。
一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。
Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。
与 ArrayList 相比,LinkedList 的增加和删除对操作效率更高,而查找和修改的操作效率较低。
以下情况使用 ArrayList :
频繁访问列表中的某一个元素。
只需要在列表末尾进行添加和删除元素操作。
以下情况使用 LinkedList :
你需要通过循环迭代来访问列表中的某些元素。
需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
更多请查看 LinkedList--api
模拟实现:
1、单链表:
//定义节点
static class Node<T> {
public T value;//数据域
public Node next;//指针域
public Node(T value, Node next) {
this.value = value;
this.next = next;
}
}
//打印单链表
public static void soutNode(Node node) {
System.out.println("node.value: " + node.value);
if (node.next != null) {
soutNode(node.next);
}
}
//打印
//模拟实现单链表
Node node3 = new Node("node_3", null);
Node node2 = new Node("node_2", node3);
Node node1 = new Node("node-1", node2);
Node head = new Node("head", node1);
soutNode(head);
打印结果:
node.value: head
node.value: node-1
node.value: node_2
node.value: node_3
1.1、插入和删除节点
//指定位置插入节点
Node node2_3 = new Node("newNode2_3",node3);
node2.next = node2_3;
//soutNode(newHead);
//删除某个指定节点,比如删除node2
node1.next = node2_3;
soutNode(newHead);
1.2、单项链表的反转
原顺序是:head、node-1、node-2、node-3
算法:
//链表反转-->head
System.out.println("开始反转>>>>>>>>>");
Node preNode = head;
Node currentNode = head;
Node tempNode;
while (currentNode != null){
tempNode = currentNode.next;//临存
currentNode.next = preNode;//指针下移
preNode = currentNode;
currentNode = tempNode;//启用临时数据
}
head.next = null;//原头结点next置空
反转后为:node-3、node-2、node-1、head