复杂链表的复制

29 篇文章 1 订阅
16 篇文章 4 订阅

什么是复杂链表?

答:每个节点包含两个指针域(next.random)和一个数据域(data),其中next指向下一个节点,而random可指向链表的任意节点(包括它本身)甚至NULL。


以下面的例子为例进行复制:


代码实现:

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

typedef int DataType;

typedef struct ComplexNode
{
	DataType data;
	struct ComplexNode *next;
	struct ComplexNode *random;
}*PComplexNode,ComplexNode;

PComplexNode CreatComplexNode(DataType data)//创建复杂节点
{
	PComplexNode newNode = (PComplexNode)malloc(sizeof(ComplexNode));
	if(NULL == newNode)
	{
		printf("out of memory,\n");
		exit(1);
	}
	newNode->data = data;
	newNode->next = NULL;
	newNode->random = NULL;
	return newNode;
}

PComplexNode CreatComplexList(PComplexNode *ComplexpHead)
{
	PComplexNode n1 = CreatComplexNode(1);
	PComplexNode n2 = CreatComplexNode(2);
	PComplexNode n3 = CreatComplexNode(3);
	PComplexNode n4 = CreatComplexNode(4);
	
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = NULL;

	n1->random = n3;
	n2->random = NULL;
	n3->random = n2;
	n4->random = n4;

	*ComplexpHead = n1;
	return *ComplexpHead;
}


void Print(PComplexNode ComplexHead)
{
	PComplexNode CurNode = ComplexHead;
	while(CurNode)
	{
		if(CurNode->random)
		    printf("[%d]:random->[%d]\n",CurNode->data,(CurNode->random)->data);
		else
			printf("[%d]:random->NULL\n",CurNode->data);
		CurNode = CurNode->next;
	}
}

PComplexNode CloneComplexList(PComplexNode pHead)
{
	PComplexNode CurNode = pHead;
	PComplexNode NewNode = NULL;
	PComplexNode NextNode = NULL;
	if(NULL == pHead)
		return NULL;
	//复制每个节点插到其位置之后
	while(CurNode)
	{
		NewNode = CreatComplexNode(CurNode->data);
		NewNode->next = CurNode->next;
		CurNode->next = NewNode;
		CurNode = NewNode->next;
	}

	//给复制的新结点的random赋值
	CurNode = pHead;
	NextNode = NULL;
    while(CurNode)
	{
		NextNode = CurNode->next;
		NextNode->random = CurNode->random;
		CurNode = NextNode->next;
	}

	//拆掉复制的节点
	if(NULL == pHead)
		return NULL;
	NewNode = pHead->next;
	NextNode = NewNode;
	CurNode = NewNode->next;
	pHead->next = CurNode;
	while(CurNode)
	{
		NextNode->next = CurNode->next;
		NextNode = NextNode->next;
		CurNode->next = NextNode->next;
		CurNode = CurNode->next;
	}
	return NewNode;
}

int main()
{
	PComplexNode pNode;
	PComplexNode CopyNode;
	CreatComplexList(&pNode);
	Print(pNode);
	printf("\n");
	CopyNode = CloneComplexList(pNode);
	Print(CopyNode);
	free(pNode);
	free(CopyNode);
	system("pause");
	return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值