链表逆向交替合并问题

问题描述:

假设有两个单链表A和B,不带头节点,且长度一样,示例如下:

A: 1->2->3->4

B: a->b->c->d

请逆转交替合并两个链表,示例结果如下:

4->d->3->c->2->b->1->a



#include <stdio.h>
#include <stdlib.h>

struct Node
{
	char c;
	struct Node* next;
};

/*
构造链表
head表示链表头,baseChar表示第一个字母,seqNum表示链表元素的个数
*/
void BuildLink(Node*& head, char baseChar, int seqNum)
{
	Node* aNode=NULL;
	Node* ptrTail=NULL;
	for(int i=0; i<seqNum; ++i)
	{
		aNode=(Node*)malloc(sizeof(Node));
		aNode->c=baseChar+i;
		aNode->next=NULL;

		if(head==NULL) head=aNode;
		if(ptrTail==NULL) ptrTail=aNode;
		else
		{
				ptrTail->next=aNode;
				ptrTail=aNode;
		}
	}
}

//打印链表
void PrintLink(Node* head)
{
	Node* ptrNode=head;
	while(ptrNode)
	{
		if(ptrNode->next==NULL)
			printf("%c\n", ptrNode->c);
		else
			printf("%c-->", ptrNode->c);
		ptrNode=ptrNode->next;
	}
}

//按照题意合并链表A和B
Node* reverse_merge(Node* A, Node* B)
{
	Node* ptrCurrentA=A;
	Node* ptrCurrentB=B;
	Node *ptrNextA=NULL, *ptrNextB=NULL;
	Node* ptrPreviousA=NULL;
	while(ptrCurrentA!=NULL && ptrCurrentB!=NULL)
	{
		ptrNextA=ptrCurrentA->next;
		ptrNextB=ptrCurrentB->next;

		ptrCurrentA->next=ptrCurrentB;
		ptrCurrentB->next=ptrPreviousA;

		if(ptrNextA==NULL || ptrNextB==NULL)
			break;
		ptrPreviousA=ptrCurrentA;
		ptrCurrentA=ptrNextA;
		ptrCurrentB=ptrNextB;
	}
	return ptrCurrentA;
}

//最后调用此函数,防止内存泄露
void ReleaseLink(Node* head)
{
	Node* ptrNode=head;
	while(ptrNode!=NULL)
	{
		head=head->next;
		free(ptrNode);
		ptrNode=head;
	}
}

int main(int argc, char** argv)
{
	Node* A=NULL, *B=NULL;
	BuildLink(A, '1', 4); //构造链表1->2->3->4
	BuildLink(B, 'a', 4); //构造链表a->b->c->d
	PrintLink(A);//打印链表A
	PrintLink(B);//打印链表B

	Node* result=reverse_merge(A, B); //合并链表A和B
	PrintLink(result);//打印链表合并结果

	ReleaseLink(result); //释放掉链表,防止内存泄露
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值