一,循环单链表
1,在循环单链表中,已知结点的p,则可否从结点p出发找到它的直接前驱结点?该过程的时间复杂度是多少?
可以,时间复杂度为O(n) 方法为
temp=p; while(p->next!=temp) { p=p->next; }
循环链表特点:
1.从表中任一结点出发都能访问到表中所有结 点。
2.循环表是对称的,为了判断起始位置,一般要设置头结 点。
头结点的设置也可将空表和非空表的逻辑状态及运算统一起来。
3.循环表的运算和线性链表基本一致, 有时可简化某些运算。
2,为什么在单循环链表中设置尾指针比设置头指针更好?
带头指针的循环链表需要遍历整个数组才能找到尾结点,而带尾指针的循环链表只需要.next就能找到头指针。
3,已知一个线性表,经常做在表尾插入元素和删除表尾元素,试分析下列哪种存储表示法更省时?(顺序表,已知头指针的单链表,已知尾指针的循环单链表,已知头指针循环双向链表,已知头指针的双向链表)
已知一个线性表,经常做在表尾插入元素和删除表尾元素
所以时间复杂度上:
顺序表:O(1)(通过下标在表尾操作)
已知头指针的单链表:O(n)
已知尾指针的循环单链表:O(1)插入,O(n)删除
已知头指针循环双向链表:O(1)
已知头指针的双向链表:O(n)
顺序表和已知头指针循环双向链表都是O(1),但语句上已知头指针循环双向链表要多一些,所以顺序表更省时。
二,合并表
例1:合并线性表
●问题:集合A和B分别用两个线性表L A和LB表示,求A∪B并用线性表LA
表示。
●算法设计:
一思想:从LB中逐一取出元素判该元素是否在LA中,若不在则将该元素插入到LA中。
●细化:到实现程度
一 逐一:从第一个到最后一个,计数型循环,前提是需要知道元素个数
一 如何取出第i个数据元素b?
一 如何判断b;是否已在A中?
一 如果不在A中,怎样实现将b插入?
分析:
一最好情形分析: B为A的前面部分元素:1 +2+... +n= (n+1)*n/2
一最坏情形分析: B∩A为空:m+(m+1).. +(m+n-1)= n*m+(n-1)*n/2
根据前面的对合并线性表的算法分析,有没有可能采用什么
措施进行优化?
答案:选数据元素个数少的作为Lb
例2:合并有序表
●问题:已知线性表L a和L b中元素分别按非递减顺序排列,现要求将它们合并成一个新的线性表Lc, 并使得Lc中元素也按照非递减顺序排列。
●分析:线性表Lc初始为空。依次扫描La和Lb中的元素,比较当前元素的值,将较小值的元素插入Lc的表尾之后,如此反复,直到一个线性表扫描完毕,然后将未完的那个线性表中余下的元素逐个插入到Lc的表尾之后