目录
一 线性表(linear list)
1.概念:
线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构常见的线性表:顺序表(动态数组)、链表、栈、队列、字符串
2.性质:
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
二 顺序表
1.概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:
静态顺序表:使用定长数组存储。
动态顺序表:使用动态开辟的数组存储。
静态顺序表适用于确定知道需要存多少数据的场景.
静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用.
2.缺点
a)在顺序表的头部/中间位置插入和删除元素很耗时,存在大量的元素搬移工作。
b)顺序表的扩容是一个耗时操作,需要释放旧空间,并且而拷贝原有数组的值。
c)顺序表的扩容会造成大量空间的浪费。
之所以有以上缺点的存在,引入链表的概念。
三 链表
1.链表的概念
链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。
2.链表的分类
链表的结构非常多样,以下情况组合起来就有8种链表结构:
(1)单向、双向
(2)带头、不带头
(3)循环、非循环
3.无头结点的单向链表
1.定义
单向链表只能从头走到尾,不能从后向前。(链表也可以作为其它数据结构的应用:哈希表,图的邻接表)
2.性质
可以将单链表类比于现实生活中的车厢,有车头和车厢。
2.1车厢的定义
/车厢类
class Node{
//存储具体元素
int data;
//存储下一个结点的地址
Node next;
public Node(int data){
this.data = data;
}
public Node(int data, Node next){
this.data = data;
this.next = next;
}
}
2.2火车头的定义
public class SingleLinkedList {
//当前火车中车厢的个数
private int size;
//当前火车的第一个节点
private Node head;
}
2.3单链表的增删改查(CURD)
添加元素:addFirst(int data)
addLast(int data)
addIndex(int index,int data)
/**
* 头部添加元素
* @param data
*/
public void addFirst(int data){
//先判断当前火车是否为空,若一个节点都没有,要插入的结点就是第一个节点
if (size == 0){
Node node = new Node(data);
head = node;
size++;
}else {
//当前火车已经存在节点
Node node = new Node(data);
node.next = head;
head = node;
size++;
}
}
/**
* 在随意索引处插入
* @param index
* @param data
*/
public void addIndex(int index, int data){
//判断index的合法性
if (index < 0 || index > size){
System.err.println("add index illegal!");
return;
}
//若index = 0
if (index == 0){
//链表的头部节点插入
addFirst(data);
return;
}
//若index在中间位置(包括尾部)
//此时需要找到待插入位置index的前驱节点
//单链表只能从前向后遍历
Node node = new Node(data);
Node prev = head;
for (int i = 0; i < index - 1; i++) {
prev = prev.next;
}
//prev引用指向当前插入index的前驱
node.next = prev.next;
prev.next = node;
size++;
}
/**
* 在链表尾部插入
* @param data
*/
public void addLast(int data){
addIndex(size,data);
}
public String toString(){
String ret = "";
//此时要设置一个临时变量node来存储head的值
Node node = head;
while (node != null){
ret += node.data + "->";
//继续访问下一节车厢
node = node.next;