顺序表和单链表的有点和缺点
顺序表的优点: 1,物理存储空间连续,支持下标的随机访问。 2,CPU高速缓存命中率高(这个具体的原因我也不太懂🤭) 缺点: 1,在头部和中部及两者之间插入删除要挪动元素,效率低O(n) 2,由于物理空间连续,空间不够要扩容,扩容本身就有消耗,扩容机制存在一定的空间浪费。
单链表的优点: 1,在任意的位置插入删除元素,效率高。 2,按需扩容 缺点: 1,不支持下标的随机访问,一些算法不适合在它上面进行:如排序,二分查找
顺序表和链表相关的选择题
1.在长度为 n 的顺序表下标为 i 的位置前插入一个元素(1 ≤ i ≤ n),元素的移动个数为( ) A.n - i + 1 B.n - i C.i D.i - 1 解析:关于这一类的题目,我建议大家带特殊值用排除法(这样很容易避免出错)。 假设有n个元素,就在下标为1的位置插入,显然要移动n-1个元素。 在下标为n的位置 (尾插),不需要移动元素,为0。所以答案为B
- 在单链表指针为p的结点之后插入指针为s的结点,正确的操作是( )
A.p->next=s; s->next=p->next; B.p->next=s->next; p->next=s; C.s->next=p->next; p->next=s; D.p->next=s->next; p->next=s; 解析: 3.在一个单链表中,q 的前一个节点为 p,删除 q 所指向节点时,以下代码正确的执行语句及次序是( ) ①q->next=p->next; ②p->next=q->next; ③delete p; ④delete q; 解析:显然2,4就可以了 4。下列判断循环双向带头链表为空的语句中,正确的是( ) A.headNULL; B.head->nextNULL; C.head->next==head; D.head!=NULL;
解析:没有元素的时候i,就一个头,显然头的next指向之间,C
5.在长度为n(n>1)的单链表上,设有头和尾两个指针,执行( )操作与链表的长度有关。 A.在单链表第一个元素前插入一个新元素 B.在单链表最后一个元素后插入一个新元素 C.删除单链表中的第一个元素 D.删除单链表中的最后一个元素
解析:有头和尾指针,我要删除单链表最后一个元素,我要拿到倒数第二个节点的地址,而通过 尾指针是拿不到的(因为单链表节点的指针只能存放下一个节点的地址),只能通过头来遍历,所以与长度有关
- 在一个循环双向链表中,要在p所指的节点之前插入s所指节点,以下代码正确的执行次序是( )
①p->prev->next=s; ②p->prev=s; ③s->prev=p->prev; ④s->next=p;
栈和队列的实现以及一些题。
栈:先进后出,只需要在尾部插入删除,显然用顺序表要好一些。(可以一边入栈,一边出栈) 队列:先进先出,要在头部删除,尾部插入,用链表好一些。
栈和队列互相实现的主要思路
用两个栈来实现队列:
用两个队列来实现一个栈:
循环队列实现的主要思路
如果需要存储N个元素,开辟N+1个空间(多开一个空间方便判断满和空)
入队:在tail的位置入,tail++ 出队:head++
|