线性表是由具有相同类型的有限数据元素组成的,数据元素是由数据项组成的。
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号,姓名,性别等数据项组成。
线性表是具有n个数据元素的有限序列。
顺序表可以按照序号进行随机存取,时间复杂度为O(1)。
3n个元素的线性表的数组表示中,时间复杂度是怎么样的? (1)访问第i(1<=i<=n)结点和求第i(2<=i<=n)个结点的直接前驱。该操作时间复杂度为O(1)。每个数据元素的存储位置和线性表的起始位置相差一个和该数据元素的位序成正比的常数,因此,线性表中的任一数据元素可以随机存取,所以线性表的顺序结构是一种随机存取的数据结构。
(2)在最后一个结点后面插入一个新的结点。该操作时间复杂度为O(1)。查找最后一个结点时间复杂度为O(1),插入之后不需要移动元素,因此该操作的时间复杂度就是查找最后一个结点的时间复杂度O(1)。
(3)删除第一个结点。该操作的时间复杂度为O(n)。删除顺序表L中第i个元素的位置,并将第i+1个元素及其后的所有元素前移一个位置。
删除表尾元素(即i=n),无需移动元素,时间复杂度为O(1)。
删除表头元素(即i=1),需移动出表头元素外的所有元素,时间复杂度为O(n)。
顺序表仅需要三次。
如果要把1234掉换成1324该如何操作?
定义三个指针*p,*p1,*p2分别指向123的位置。
即 p=head; p1=p->next; p2=p1->next;
p->next=p2;//原本p是指向p1的,也就是1后面是2,现在p指向p2了,也就是1后面是3 p1->next=p2->next;//原本p1是指向p2的,也就是2的后面就是3,现在p1指向p2的后继,就是说2的后面是4。 p2->next=p1;//原本3的后面是4,现在3的后面是2。
这说明顺序表和链表的交换次数是一样的,都是3次,但查找的时间复杂度必然不同。
5若长度为n的非空线性表采用顺序存储结构,在表的第i个位置插入一个数据元素,则i的合法值为1到n+1。线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。
可以在表头插入i=1,也可以在表尾插入,i=n+1。
静态链表是借助数组来描述线性表的链式存储结构,结点也有数据域data和指针域next,与一般链表中的指针不同的是,这里的指针是结点的相对地址(数组下标),又称游标。和顺序表一样,静态链表也要预先分配一块连续的内存空间。
静态链表以next==-1作为其结束的标志。静态链表的插入,删除操作与动态链表的相同,只需要修改指针,而不需要移动元素。
快速排序,堆排序,二路归并排序平均情况下的时间复杂度为O(nlog2n)。其他的比它们都要慢,所以得出结论:
数组排序最好的时间复杂度为O(nlog2n)。
建立一个单链表所需的时间复杂度为O(n)。
综上所述,总时间复杂度为O(nlog2n)。
通常用头指针来标识一个单链表,如单链表L,头指针为null时表示一个空表。此外,为了操作上的方便,在单链表第一个结点之前附加一个结点,称为头结点。头结点的数据域可以不设任何信息,也可以记录表长等信息。头结点的指针域指向线性表的第一个元素结点。
头结点与头指针的区分:不管带不带头结点,头指针都始终指向链表的第一个结点,而头结点是带头结点的链表中的第一个结点,结点内通常不存储信息。
(1)由于第一个数据结点的位置被存放在头结点的指针域中,因此在链表的第一个位置上的操作和在表的其他位置上的操作一致,无需进行特殊处理。
(2)无论链表是否为空,其头指针都指向头结点的非空指针(空表中头结点的指针域为空),因此空表和非空表的处理也就得到了统一。
这是因为删除单链表的最后一个结点需置其前驱节点的指针域为null,需要从头开始依次遍历找到该前驱节点,需要O(n)的时间,也就和表长有关。



