C语言-按奇偶分解单链表

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值