线性表为零个或多个数据元素的有限序列。
序列表示元素之间是有顺序的,若存在多个元素,则第一个元素无前驱,最后一个元素无后继。其余每个元素都有且只有一个前驱和后继。
线性表的顺序存储结构,指的是用一段地址连续的存储单元依此存储线性表的数据元素。
使用数组即可实现顺序存储结构。
{
int MAX_SIZE; // array max size
T[] arrayData; // array data
int length; // array length
}
数据长度与数组长度的区别:
数组长度的存放线性表的存储空间的长度,存储分配后一般是不会发生变化的。
线性表长度是线性表中实际的元素个数,随着元素的插入和删除,长度是不断变化的。
int[] arrayInt = new Int[3];
arrayInt[0] = 1;
arrayInt[1] = 2;
// array length is three,data size is two
内存地址计算:
存储器中每个存储单元都有自己的编号,这个编号即为内存地址。
由于数组分配一块地址连续的内存地址,所以只要知道第一个储存单元地址,就可以推算出其它储存单元地址。
因此顺序表读取一个元素的时间复杂度为O(1)。
查询插入删除操作:
对于线性表的顺序存储来说,获取第i个元素非常简单,只要不超过数组下标,直接返回数组i-1下标值即可。
在第i个位置插入数据时,如果i-1下标有值时,则i-1 下标及之后的值都需要后移一位。
在第i个位置删除数据时,如果i-1下标之后有值,则应该前移一位。
顺序存储的优点:
线性表的链式存储结构是用一组任意的存储单元存储线性表的数据元素,这组数据单元可以是连续的,也可以是不连续的。
为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对于ai来说,除了存储其本身信息之外,
还需存储一个指示其直接后继的信息。我们将保存存储元素数据信息的域称之为数据域,把存储直接后继位置的称为指针域。
指针域中存储的信息称做指针或链。这两部分域组成数据元素ai的存储映像,称为结点。
n个结点链接成一个链表,即为线性表(a1,a2,a3,a4...)的链式存储结构。
由于每个结点只包含一个指针域,也叫做单链表。
单链表的实现为:
class Node<E> {
E item;
Node<E> next;
Node(E element, Node<E> next) {
this.item = element;
this.next = next;
}
}
查询插入删除操作:
链式结构的优点:
链式结构的缺点:
双向链表:
双向链表即 在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
原文:https://www.cnblogs.com/cd-along/p/14779072.html