题目:将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。
关键字:带头结点单链表+分解
思路
关注:每个元素的序号的奇偶性判断小助手:访问序号变量+除以2是否有余数的判断
1.设置一个访问序号变量(初值为0),每访问一个结点序号自动加1,
需要变量:A,B, 原表遍历工作指针p,指向待分解的结点
访问序号变量c
2.根据序号的奇偶性将结点插入到A表或B表中。
尾插法:A,B各自尾指针 ra, rb
3.重复以上操作直到表尾
LinkList DisCreat_1(LinkList &A){ //将表A中结点按序号的奇偶性分解到表A或表B中
i=0;//访问序号变量
B=(LinkList)malloc(sizeof(LNode));//创建表B的表头
B->next=NULL;//初始化表B
LNode*ra=A,*rb=B;//ra和rb将分别指向最终创建的表A和表B的尾结点
p=A->next;//p为链表工作指针,指向原来A表中待分解的结点
A->next=NULL;//把A表的头结点摘下来,置空(配置+清空)新的A表
while(p!=NULL){
i++; //序号从1开始,每经过一个结点就要加一
if(i%2==0){ //处理序号为偶数的链表结点
rb->next=p;//在B表尾插入新结点
rb=p;//rb指向新的尾结点
}
else{//处理原序号为奇数的结点
ra->next=p;//在A表尾插入新结点
ra=p;//ra指向新的尾结点
}
p=p->next;//将p恢复为指向新的待处理结点,回到原来A表
}
ra->next=NULL;
rb->next=NULL;
return B;
}