1.1 基本介绍
链表(linked list)
是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。链表中数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域(data),另一个是存储下一个结点地址的指针域(next)。(百度百科)
1.2 存储原理
链表的每一个节点分布在内存的不同位置,依靠next
指针关联起来。这样可以灵活有效地利用零散的碎片空间。链表的第1
个节点被称为头节点(3)
,没有任何节点的next
指针指向它,或者说它的前置节点为空头结点用来记录链表的基地址。有了它就可以遍历得到整条链表链表的最后1
个节点被称为尾节点(2)
,它指向的nex
t为NULL
。
1.3 添加操作
1、思路分析
- 为了让代码更加精简,统一所有节点的处理逻辑,可以在最前面增加一个虚拟的头结点(不存储数据)
- 新节点的
next
指针,指向插入位置的节点。插入位置前置节点的next
指针,指向新节点。 - 只要内存空间允许,能够插入链表的元素是无限的,不需要像数组那样考虑扩容的问题。
头部添加
当链表为空时,头部插入
当链表不为空时,从头部插入。
先让新的节点指向头结点,然后再让头结点指向新节点!!!
尾部添加
先让尾指针指向的节点,指向新节点
然后tail
从新指向新节点
中间添加
定义一个指针prev
,将prev
的当前下一跳给新节点的下一跳。然后再让prev
节点重新指向新节点
2、代码示例
接口实现:List
package cn.linkedlist.demo01;
/***
* List接口方法
* @param <E>
*/
public interface List<E> extends Iterable<E>{
void add(E element);
void add(int index, E element) ;
void remove(E element);
E remove(int index);
E get(int index);
E set(int index, E element) ;
int size();
int indexOf(E element) ;
boolean contains(E element);
boolean isEmpty();
void clear();
}
链表实现:LinkedSinglyList
package cn.linkedlist.demo01;
import java.util.Iterator;
public class LinkedSinglyList<E> implements List<E>{
// 创建Node节点
private class Node{
//数据域 用来存储数据的
public E data;
//指针域 用来存储下一个结点对象的地址
public Node next;
// 构造方法
public Node() {
this(null, null);
}
public Node(E data) {
this(data, null);
}
public Node(E data, Node next) {
this.data = data;
this.next = next;
}
@Override
public String toString(){
return data.toString();
}
}
// 链表元素的数量
private int size;
//链表当中的头指针指向第一个结点对象
private Node head;
//链表当中的头指针指向最后一个结点对象
private Node tail;
// 初始化链表
public LinkedSinglyList(){
head = null;
tail = null;
size = 0;
}
public LinkedSinglyList(E[] arr){
for (E e : arr){
add(e);
}
}
/***
* 在链表末尾添加新的元素e
* @param element
*/
@Override
public void add(E element) {
add(size, element);
}
/***
* 根据链表的index位置添加新的元素e
* @param index
* @param element
*/
@Override
public void add(int index, E element) {
if (index < 0|| index > size) {
throw new ArrayIndexOutOfBoundsException("add index out of bounds