题目要求:设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
分析:要求空间复杂度为O(1),那直接让L前后元素依次交换值即可。
void Reverse (Sqlist &L) {
Elemtype temp; //中间量
for (i=0; i<L.length/2;i++) {
temp=L.data[i] ; //交换 L.data[i]与L.data[L.length-i-1]
L.data[il=L.data[L.length-i-1];
L.data[L.length-i-1]=temp;
}
}
题目要求:在带头结点的单链表L中,删除所有值为X的结点,并释放其空间,假设值为X的结点不唯一,试编写算法以实现上述操作
分析:
void Del_X (Linklist $L,ElemType x){
//p用于遍历链表;而pre是p的前驱结点,并且始终指向p;q用于接收值为x的结点,以便于释放。
//三者缺一不可,居然有人说可以少用,我想不出来,还是王道书这种更简单。
LNode *p=L->next,*pre=L,*q;
While(p!=NULL){
if(p->data==x){//第二种情况
q=p; //q来接收
p=p->next;
pre->next=P;
free(q); //释放
}
else{//第一种情况
pre=p;
p=p->next;
}
}
}