• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >数据结构 > 复杂链表复制

复杂链表复制

作者: 字体:[增加 减小] 来源:互联网 时间:2018-08-06

通过本文主要向大家介绍了复杂链表的复制等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
//复杂链表的复制
#pragma once

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

typedef struct ComplexNode {
	int	data;
	struct ComplexNode	*pNext;
	struct ComplexNode	*pRandom;
}	CN;


CN	* Copy(CN *pFirst)
{
	CN	*pNode;
	CN	*pNewNode;
	CN	*pOldRandom;
	CN	*pNewRandom;

	// 1. 复制结点,放到老结点后边
	for (pNode = pFirst; pNode != NULL; pNode = pNode->pNext->pNext) {
		pNewNode = (CN *)malloc(sizeof(CN));
		assert(pNewNode);
		pNewNode->data = pNode->data;
		pNewNode->pRandom = NULL;

		pNewNode->pNext = pNode->pNext;
		pNode->pNext = pNewNode;
	}

	// 2. 复制 pRandom
	for (pNode = pFirst; pNode != NULL; pNode = pNode->pNext->pNext) {
		pNewNode = pNode->pNext;
		pOldRandom = pNode->pRandom;
		if (pOldRandom != NULL) {
			pNewRandom = pOldRandom->pNext;
			pNewNode->pRandom = pNewRandom;
		}
	}

	//	3. 拆链表
	CN	*pNewFirst = pFirst->pNext;
	for (pNode = pFirst; pNode != NULL; pNode = pNode->pNext) {
		pNewNode = pNode->pNext;

		pNode->pNext = pNewNode->pNext;
		if (pNode->pNext != NULL) {
			pNewNode->pNext = pNode->pNext->pNext;
		}
		else {
			pNewNode->pNext = NULL;
		}
	}

	return pNewFirst;
}

CN	* Buy(int data)
{
	CN	*pNode = (CN *)malloc(sizeof(CN));
	assert(pNode);
	pNode->data = data;
	pNode->pRandom = NULL;
	pNode->pNext = NULL;

	return pNode;
}

void Print(CN *pFirst)
{
	CN	*pNode;
	for (pNode = pFirst; pNode; pNode = pNode->pNext) {
		printf("[%d, (%p, %d)] ",
			pNode->data,
			pNode->pRandom,
			pNode->pRandom ? pNode->pRandom->data : 0);
	}
	printf("\n");
	printf("pFisrt:[%d,(%p, %d)]",
		pFirst->data,
		pFirst->pRandom,
		pFirst->pRandom ? pFirst->pRandom->data : 0);
}

void TestCN()
{
	CN	*p1 = Buy(1);
	CN	*p2 = Buy(2);
	CN	*p3 = Buy(3);
	CN	*p4 = Buy(4);

	p1->pNext = p2;
	p2->pNext = p3;
	p3->pNext = p4;

	p1->pRandom = p4;
	p4->pRandom = p1;
	p2->pRandom = p2;

	//Print(p1);

	CN	*pNew = Copy(p1);

	Print(pNew);
}



//在牛客网的oj环境下编译通过的
//void CloneRandom(RandomListNode* pHead){
//	RandomListNode* pCloned;
//	while (pHead != NULL){
//		pCloned = pHead->next;
//		if (pHead->random != NULL){
//			pCloned->random = pHead->random->next;
//		}
//		pHead = pCloned->next;
//	}
//}
//
//RandomListNode* ReConnectNodes(RandomListNode* pHead){
//	RandomListNode* pClonedHead = NULL;
//	RandomListNode* pClonedNode = NULL;
//	RandomListNode* pNode = pHead;
//
//	if (pNode != NULL){
//		pClonedHead = pClonedNode = pNode->next;
//		pNode->next = pClonedNode->next;
//		pNode = pNode->next;
//	}
//
//	while (pNode != NULL){
//		pClonedNode->next = pNode->next;
//		pClonedNode = pClonedNode->next;
//		pNode->next = pClonedNode->next;
//		pNode = pNode->next;
//	}
//	return pClonedHead;
//}

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-06-28数据结构教程 第二十四课 遍历二叉树
  • 2017-06-28数据结构教程 第二十课 广义表
  • 2017-08-17验证哥德巴赫猜想
  • 2017-06-28数据结构教程 第三十七课 实验八 排序实验
  • 2017-08-17面向对象编程(OOP)理解
  • 2017-06-28数据结构C语言实现之线性表
  • 2017-06-28数据结构教程 第十四课 串的定义
  • 2017-06-28数据结构教程 第二十八课 图的存储结构
  • 2017-06-28数据结构教程 第三十九课 索引文件
  • 2017-06-28数据结构教程 第十七课 实验三:栈的表示与实现及栈的应用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 数据结构教程 第二十八课 图的存储结构
    • 数据结构教程 第四十课 总复习
    • UVa1584 环状序列 (Circular Sequence)
    • 数据结构教程
    • 数据结构教程 第二十一课 树、二叉树定义及术语
    • 数据结构教程 第二十二课 实验五 数组实验
    • 二进制格雷码与自然二进制码的互换
    • 数据库理论:学习基于SQL数据库的算法
    • 有序链表转换二叉搜索树
    • 九宫问题(八数码)求解过程动态演示

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有