1、线性结构与非线性结构,主要看元素之间的关系。若是一对一关系就是线性表,如果不是一对一就是非线性。
2、LS=((a,b,c),(d,e,f));
tail(LS)=((d,e,f));
head(tail(LS))=(d,e,f);
tail(head(tail(LS)))=(e,f);
head(tail(head(tail(LS))))=e;
任何一个非空广义表的表头是表中第一个元素,可以是原子,也可以是子表,而其表尾必定是子表。
广义表的head操作,取出的元素是什么,那么结果就是什么。但是tail操作取出的元素外必须加一个表“()”
3、单循环链表的主要优点:从表中任一结点出发都能扫描整个链表。单循环表由于不知道前趋,所以在删除时候必须从需要删除的结点的前趋下手,因此并非单循环链表的有点。
头指针是链表的必要元素,不管链表是否为空,头指针都不为空。
链表在内存中都是独立的存储单元,通过地址进行指向链接,不论是否是单循环还是双循环链表,在进行插入操作时都会断开。
4、将两个各有n个元素的有序表归并成一个有序表,其最多的比较次数是:2n-1
分析:前n-1个每个最多比较两次,最后一个只比较一次。
5、对n个记录的线性表进行快速排序为减少算法的递归深度,每次分区后,先处理较短的部分。
6、已知两个长度分别为m和n的升序链表,若将它们合成一个长度为m+n的降序链表,则最坏的情况下时间复杂度是:O(m+n).
分析:最好、最坏情况,时间复杂度都是O(m+n),因为题目要求是两个升序链表,合并成一个降序链表。
补充:将N条长度均为M的有序链表进行合并,合并以后的链表也保持有序,时间复杂度为:O(N*M*logN)
补充2:两个无环点链表L1,L2,其长度分别为m和n(m>n),判定L2,L1是否相交的时间复杂度:O(m+n),空间复杂度:O(1)、
7、单向链表:
1)如果两个单向链表相交,尾结点一定相同。
(如果两个链表都为单链表,那么一旦相交意味着两个节点的next相同,之后也都相同,所以尾结点也相同)
2)快慢指针是判断一个单向链表有没有环的一种方法。(如果一个是单链表,一个有环,就不可能存在相交的情况。这其中判断链表是否有环就是用的快慢指针法:设置两个指针,一个跳一格,一个跳两格,追上自然有环。)
3)有环的单向链表跟无环的单向链表不可能相交。
4)两个单向链表之间相交可以存在环。(如果都是循环链表,遍历其中一个链表,直到找到与另一链表中某结点相同的结点就算是相交。)
8、设顺序表长度为n,最坏情况下,
1)寻找最大项比较次数:n-1;
2)顺序查找比较次数:n
3)快速排序比较次数:n*(n-1)/2
4)堆排序:nlogn
9、线性表元素个数n(n>=0)定义为线性表的长度、
10、带头结点的单链表head为空的判定条件:head->next==NULL;
带头结点的循环链表:head->next==head;
不带头结点的单链表head为空的判定条件:head==NULL;