数据结构第二版(朱昌杰版)习题2答案
单选题
1-10 acadb,badab
难点简述:就第一题需要说明一下,直接特殊值参考,n-1,就很过分了,当n=1时,是不是就不需要比较了?so,A
算法设计题:
1、求一个不带头节点的单了表中的节点个数
int countNode(LinkList L){
int count=0;
LNode *p=L;
while(p!=NULL){
count++;
p=p->next;
}
return count;
}
秒杀
2、求一个带头节点的单链表中的节点个数(忍住,这是多鄙视)
int countNode(LinkList L){
int count=0;
LNode *p=L->next;
while(p!=NULL){
count++;
p=p->next;
}
return count;
}
3、在一个单链表中的值为Y的节点前面插入一个值为X的节点,即使值为X为新节点成为Y节点的前驱节点
void insertY(LinlList L,int Y,int X){
LNode *p=L->next,*q;
LNode *k=(LinKlList)malloc(sizeof(LNode));
k->data=X;
while(p->data==Y){
q=p;
p-=p->next;
}
if(p->data==Y) q->next=k; k->next=p;
}
4、设计一个顺序表中的各个结点值是否有序,判断有序或者,可以直接判断,第一个结点和后面对比是不是最大或者对小,然后继续往后面移动,算法时间复杂度大概为n^2;
void isSort(LinklList L){
LNode *p,*q;
p=L->next;
while(p==NULL){
while(q==NULL){
if(p->data<q->data){
printf("The LinkList haven't sorted! ");
return ;
}
q=q->next;
}
p=p->next;
q=p->next;
}
}
5、利用单链表原来的结点空间将一个单链表进行就地逆转(我的blog里面有写过的,可以直接参考,这里是没有经过编译器编译的,纯手写)
void reverseLinkList(LinkList L){
LNode *p,*q;
p=L->next;
L->next=NULL;
while(p!=NULL){
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}
6、将一个链表里面的偶数留下,奇数给另一个链表且保持原来的顺序:
解法:直接一层判断,插入,代码就不贴了;
7、删除所有大于X和小于Y的值;
解法:关键是留p指向前一个q,进行删除操作;q-next=p->next; over
8.插入一个数值为X,到递减的一个链表里面:
直接一层循环,判断P->data>X;p->next->next<X;就将X插入到P后面
OVER;
9.删除重复值在某链表中
循环做while(){}
p和q;解决;
10、单链表的排序欧耶,这个结束
11、两个有序链表合并(easy)
指针后移++,就是这样dei
q、p、k;
12、两层循环,拿出重复的值或者两个while
13、双链表、插入,直接进入后继和前驱
14、设计一个从右往左打印双向链表