攻克数据结构和算法——第二天:线性表

目录

一,循环单链表

1,在循环单链表中,已知结点的p,则可否从结点p出发找到它的直接前驱结点?该过程的时间复杂度是多少?

2,为什么在单循环链表中设置尾指针比设置头指针更好?

3,已知一个线性表,经常做在表尾插入元素和删除表尾元素,试分析下列哪种存储表示法更省时?(顺序表,已知头指针的单链表,已知尾指针的循环单链表,已知头指针循环双向链表,已知头指针的双向链表)

二,合并表

例1:合并线性表

例2:合并有序表

一,循环单链表

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的表尾之后

猜你喜欢

转载自blog.csdn.net/m0_63309778/article/details/124749925
今日推荐