题目:给定一个带表头结点的单链表,设head 为头指针,结点结构为(data,next) ,data为整型元素,next 为指针,试写出算法:按递增次序输出单表中各结点的数据元素,并释放结点所占的存储空间( 要求: 不允许使用数组作为辅助空间)
思路:每次寻找链表里的最小值,然后输出后删除即可。
代码:
//递增输出结点元素,并释放空间
void sortlistandfree(LinkList &L){
//初始化前驱节点 暂存节点 工作节点
LNode *pre,*r,*p;
//遍历L
while(L){
//保存前驱为头节点
pre = L;
//p指向第一个元素
p = pre->next;
//对第一个元素向后遍历
while(p->next){
//如果找到最小值,更新前驱
if(p->next->data < pre->next->data)pre=p;
//p后移
p = p->next;
}
//打印该删除的节点
printf("%d",pre->next->data);
//r暂存删除节点
r = pre->next;
//前驱next后移
pre->next = r->next;
//释放节点
free(r);
}
//释放头节点
free(L);
}
题目:在一个递增有序的线性表中, 有数值相同的元素存在·。若存储方式为单链表,设计算法去掉数值相同的元素, 使表中不再有重复的元素, 例如( 7 , 10 , 10 , 21 , 30 , 42 , 42,42 , 51 , 70 ) ,将变为( 7 , 10 , 21 , 30 , 42 ,51,70)。
思路:快慢指针操作,类似顺序表里的替换,只不过这里的节点要保存释放。
代码:
//去除相同元素,快慢指针问题
void removesamenode(LinkList &L){
//初始化节点 a指向第一个元素 b指向第二个元素 r暂存 pre保存前驱
LNode *a = L->next,*b = a->next,*r,*pre;
//遍历开始
while(a && b){
//如果元素不相等
if(a->data!=b->data){
//保存慢节点指针
pre = a;
//a前移
a = a->next;
//b前移
b = b->next;
}else{
//r暂存a
r = a;
//a前移
a=a->next;
//前驱更新
pre->next = a;
//释放r
free(r);
//b前移
b = b->next;
}
}
}