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

实现复杂链表的复制。

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

思路就这样。

我直接给出代码:

#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;
}
时间: 2024-10-26 06:42:14

【数据结构】复杂链表的复制的相关文章

浅谈复杂链表的复制

链表是一种很常见的数据结构,单链表.双向链表.循环链表和复杂链表都是其衍生物.复杂链表之所以命名为复杂链表,也正是由于其结构的复杂.它比其他其他种类的链表多了一个指针域,这个指针域可以指向链表中的任一结点,也可以为空. 其结构定义如下: struct ComplexNode { DataType _data; struct ComplexNode * _next; struct ComplexNode * _random;//随机域 }; 结构示例: ps:蓝色指针为next域,红色为rando

C语言之复杂链表的复制(图示详解)

什么是复杂链表? 复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点.今天我们要实现的就是对这样一个复杂链表复制产生一个新的复杂链表. 复杂链表的数据结构如下: 1 typedef int DataType; //数据域的类型 2 3 //复杂链表的数据结构 4 5 typedef struct ComplexNode 6 7 { 8 9 DataType _data ; //

数据结构-复杂链表的复杂

题目:请实现函数ComplexListNode*  Clone(ComplexListNode* pHead),复杂一个复杂链表.在复杂链表中,每个节点除了有一个Next指针指向下一个节点外,还有一个Sibling指向链表中的任意节点或者NULL. 分析:第一反应是先复制Next,再复制Sibling.但是这种方式需要两次遍历.时间性不是很好.所以利用一个长链表方式解决时间效率. /* 剑指offer面试题26 */ #include <iostream> #include <cstri

复杂链表的复制——26

实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext的指针指向下一个结点外,还有一个m_pSibling的指针指向链表中任意结点或者NULL. 如下如所示的一个复杂链表,没有画出_sib指针的结点表示_sib指向NULL:    对于复杂链表的复制,首先可以想到的是先遍历一遍链表复制出各个结点并设置好_next指针,复制好单向的链表之后,对于_sib的随机指针则需要每一次都从头遍历找

《剑指offer》面试题26 复杂链表的复制 Java版

(定义一个新的数据结构,每个节点除了具有普通链表的next域外,还有一个额外的引用指向任意节点.我们要对由该特殊数据结构形成的链表进行复制.) 我的方法:也就是克隆一个这种特殊链表,很快想到先不考虑原链表sibling域,复制出一个新的链表,然后再去给sibling域赋值.由于sibling可以指向任何节点,而且我们是根据原链表的sibling来确定新链表中的sibling,所以每次我们寻找新链表中某个节点的sibling,都要两个指针重新从头开始扫描以确定新链表中的sibling.所以时间复杂

【剑指offer】复杂链表的复制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数.(节点编号从1开始).接下来有n个数,表示链表节点中的值.接下来有n个数Ti,Ti表示第i个节点的另

剑指offer之【复杂链表的复制】

题目: 复杂链表的复制 链接: https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&tqId=11178&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为

基本数据结构:链表(list)

copy from:http://www.cppblog.com/cxiaojia/archive/2012/07/31/185760.html 基本数据结构:链表(list) 谈到链表之前,先说一下线性表.线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表有两种存储方式,一种是顺序存储结构,另一种是链式存储结构. 顺序存储结构就是两个相邻的元素在内存中也是相邻的.这种存储方式的优点是

19--复杂链表的复制。

/* 题目: 复杂链表的复制. struct ComplexListNode { int m_vlaue; ComplexListNode *m_next; ComplexListNode *m_pSibling; }: m_next,连接下一个结点,m_pSibling随便链接结点其他节点. 这样复制结点就有难度,一次遍历明显不可能全部解决. 策略: 第一种方法: 先复制一遍链表,让m_pnext把结点连接起来.第二轮在复制另一个指针,复杂度为O(n*n); 第二种方法: 先复制一遍链表,然后