1.设计一个递归算法,删除不带头节点的单链表L中所有值为x的结点。
void Del_x(LinkList &L, ElemType x){
//递归实现在单链表L中删除值为x的结点
LNode *P; //p指向待删除结点
if(L==NULL) //递归出口
return;
if(L->data == x){ //若L所指结点的值为x
//删除 *L,并让L指向下一结点
p = L;
L = L->next;
free(p);
Del_x(L, x); //递归调用
}
else //若L所指结点的值不为x
Del_x(L-<next, x); //递归调用
}
2.在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。
void Del_x(LinkList &L, ElemType x){
//L为带头结点的单链表,本算法删除L中所有值为x的结点
LNode *p = L-<next, *pre = L, *q ; //置p和pre的初始值
while (p!=NULL){
if(p->data == x){
q= p; //q指向该结点
p = p->next;
pre->next = p; //删除 *q结点
free(q); //释放 *q结点的空间
}
else{ //否则, pre和p同步后移
pre = p;
p = p->next;
}//else
}//while
}
3.设L为带有节点的单链表,编写算法实现从尾到头反向输出每个节点的值。
void R_Print(LinkList L){
//从头到尾输出单链表L中每个结点的值
if(L->next!= NULL){
R_Print(L->next); //递归
}//if
if(L!= NULL)
print(L->data); //输出函数
}
4.试编写带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点的唯一的)。
LinkList Delete_Min(LinkList &L){
//L为带头结点的单链表,本算法删除其最小值结点
LNode *pre = L, *p = pre->next; //p为工作指针,pre为指向其前驱
LNode *minpre = pre, *minp = p; //保存最小值结点及其前驱
while (p!= NULL){
if(p->data < minp->data){
minp = p; //找到比之前找到的最小值结点更小的结点
minpre = pre;
}
pre = p; //继续扫描下一个结点
p = p->next;
}
minpre->next = minp->next; //删除最小值结点
free(minp);
return L;
}
5.试编写算法将带结节点的单链表就地逆置,所谓“就地”是指辅助空间复杂度为O(1)。
LinkList Reverse_2(LinkList L){
//依次遍历线性表L,并将结点指针翻转
LNode *pre, *p = L->next, *r = p->next;
p->next = NULL; //处理第一个结点
while (r!= NULL){ //r为空,则说明p为最后一个结点
pre = p; //依次遍历
p = r;
r = r->next;
p->next =pre; //指针反转
}
L->next =p; //处理最后一个结点
return L;
}