【数据结构】复杂链表的复制

    实现复杂链表的复制。

    因为复杂链表中每个节点都有一个指向任意节点的指针。所以在确定这个链表的复制的时候。我们需要进行空间来换取时间上的效率。然后我们可以将链表复制项结合在拆分。

    思路就这样。

    我直接给出代码:

#pragma once
#include <stdio.h>
#include <malloc.h>
#include <assert.h>

typedef int DataType;

typedef struct ComplexNode
{
	DataType	 _data;				// 数据
	struct ComplexNode* _next;		// 指向下一个节点的指针
	struct ComplexNode* _random;	// 指向随机节点
}ComplexNode;

void creatComplexNode(ComplexNode* &pHead,DataType x);
ComplexNode* CopyComplexNode(ComplexNode* pHead);
//创建复杂链表。
void creatComplexNode(ComplexNode* &pHead,DataType x)
{
	ComplexNode *ret,*endNode;
	if(pHead == NULL)
	{
		pHead = (ComplexNode*)malloc(sizeof(ComplexNode));
		pHead->_random = NULL;
		pHead->_data = x;
		pHead->_next = NULL;
		return;
	}
	endNode = pHead;
	ret = endNode;
	while(endNode->_next)
	{
		ret = endNode;
		endNode = endNode->_next;
	}
	endNode->_next = (ComplexNode*)malloc(sizeof(ComplexNode));
	endNode = endNode->_next;
	endNode->_next = NULL;
	endNode->_data = x;
	endNode->_random = ret;
}

//解决复杂链表的复制。可以把其中的操作分为3个步骤:
//合并。
//复制随机指针值。
//拆分。
ComplexNode *CopyComplexNode(ComplexNode *pHead)
{
	ComplexNode *copyNode;
	ComplexNode *pNode = pHead;
	ComplexNode *newLink = NULL;
	ComplexNode *newNode = NULL;
	assert(pHead);
	while(pNode != NULL)
	{
		copyNode = (ComplexNode*)malloc(sizeof(ComplexNode));
		copyNode->_data = pNode->_data;
		copyNode->_next = pNode->_next;
		copyNode->_random = NULL;

		pNode->_next = copyNode;
		
		pNode = copyNode->_next;
	}

	pNode = pHead;

	while(pNode != NULL)
	{
		copyNode = pNode->_next;
		if(pNode->_random != NULL)
		{
			copyNode->_random = pNode->_random->_next;
		}
		pNode = copyNode->_next;
	}

	pNode = pHead;
	newLink = pNode->_next;
	while(pNode != NULL)
	{
		newNode = pNode->_next;
		pNode->_next = newNode->_next;
		pNode = pNode->_next;
		if(newNode->_next != NULL)
			newNode->_next = pNode->_next;
	}
	return newLink;
}


本文出自 “剩蛋君” 博客,转载请与作者联系!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值