题目:在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。
关键字:带头结点单链表L,按值删除,释放空间
思路1
本题为正常的删除操作,因为是单链表,所以需要借助两个指针,一个负责判断当前结点并执行删除操作,一个负责将前驱元素链接给后继元素(否则此单链表就断了)
需要变量:当前工作指针p,前驱工作指针pre
void Del_X_1(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;//
free(q);//
}
else{
pre=p;
p=p->next;
}
思路2:
采用尾插法建立新单链表,新单链表=原单链表-所有值为x的结点。
1.遍历L,判断当前元素是否为x
a.data=x,正常删除操作(which means需要两个指针)
b.data!=x,连入新表
需要变量:L, 遍历指针p, 前驱指针r,删除指针q
void Del_X_2(Linklist &L,ElemType x){
//L为带头结点的单链表,本算法删除L中所有值为x的元素
LNode*p=L->next,*r=L,*q;//r指向尾结点,其初值为头结点
while(p!=NULL){
if (p->data!=x){//*p结点值不为x时将其连接到L的表尾
r->next=p;//这步需要和下面那种情况联合起来看,容易理解为啥要保证r是前驱指针
r=p;
p=p->next;//继续扫描
}
else{ //*p结点值为x时将其释放
q=p;
p=p->next;
free(q);
}
}
r->next=NULL;
}