考研数据结构(每日一题)
题目:将一个带头节点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有原表序号为奇数的袁术,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。
算法图解:
算法思想:
尾插法建立单链表。设置一个访问序号变量(初始值为0),每访问一个节点序号自动加1,然后根据序号的奇偶性将结点插入A或B中,重复此操作即可。
完整代码:
LinkList DisCreat(LinkList &A){
int i = 0; //i记录A中结点的序号
LinkList B = (LinkList)malloc(sizeof(LNode)); //橙黄建B表头
B -> next = NULL; //将B置空
LNode *ra = A,*rb = B,*p; //ra和rb分别为A和B的尾结点
p = A -> next; //p为工作指针,指向待分解的结点
A -> next = NULL; //置空新的A表
while(p != NULL){
i++; //序号加1
if(i %2 == 0){ //处理序号为偶数的链表结点
rb -> next = p; //在B表尾插入新结点
rb = p; //rb指向新的尾结点
}else{ //序号为奇数的结点
ra -> next = p; //在A表尾插入新结点
ra = p;
}
p = p -> next; //将p恢复为指向新的待处理结点
}
ra -> next = NU;LL;
rb -> next = NULL;
return 0;
}