1.题目描述:
将一个带头节点的单链表A分解为两个带头节点的单链表A和B,使得A表中含有原表中序号为奇数的元素,表B中含有序号是偶数的元素,且保持原有相对顺序不表。
2.基本思想:
序号具有连续性,所以奇数后面必为偶数,即第n个在A中,则n+1必在B中。
所以,扫描单链表A,利用一个全局变量judge判断该元素是奇是偶,初始为奇。由于直接在A链表上执行操作,所以当judge为真,即该元素要留在A中时,改变A->next,即A->next=A->next->next,跳过该元素的下一个元素(要被放在B中的元素)。
B表使用尾插法,插入每一个被A跳过的元素。
3.源代码:
#include<stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList decomposeLinkList(LinkList &A){
LinkList B=(LinkList)malloc(sizeof(LNode));
B->next = NULL;
LNode *rtb = B,*L=A->next;
bool judge = true;
while(L!=NULL){
if(judge){
LNode *pre = L->next;
if(L->next!=NULL)
L->next = L->next->next;//判断是否是最后一个元素
L=pre;
judge = !judge;
}
else{
rtb->next=L;
rtb = L;
L=L->next;
judge = !judge;
}
}
rtb->next = NULL;
return B;
}
int main(){
LinkList A = (LinkList)malloc(sizeof(LNode));
A->next = NULL;
LNode *s = A;
for(int i=0;i<=10;i++){
LNode *sdata=(LNode*)malloc(sizeof(LNode));
sdata->data=i;;
s->next = sdata;
s=sdata;
}
s->next=NULL;
LNode *B = decomposeLinkList(A);
while(B->next!=NULL){
B=B->next;
printf("%d",B->data);
}
printf("\n");
while(A->next!=NULL){
A=A->next;
printf("%d",A->data);
}
return 0;
}