复杂链表的复制(随机指针)

2024-06-22 14:18

本文主要是介绍复杂链表的复制(随机指针),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意描述:请实现函数ComplexListNode *Clone(ComplexListNode* head),复制一个复杂链表。在复杂链表中,每个结点除了有一个pNext指针指向一下一个结点外,还有一个pOther指向链表中任意结点或NULL。结点的定义如下:

struct ComplexListNode {int val;ComplexListNode* pNext;ComplexListNode* pOther;
};

复杂链表如图所示:

解题思路:这里分为三个步骤:
1)复制链表,复制原始链表的任意结点N并创建新结点N`,再把N`链接到N的后面;
2)设置结点的pOther指针对应的结点,如果原始链表上结点N的pOther指针指向S,则它对应的复制结点N`的pOther指针就指向S的下一个结点S`;

3)将链表拆分为两个链表,把奇数位置的结点用pNext指针链接起就是原始链表,偶数位置用pNext指针链接起来就是复制的链表;

处理过程如图:

 

//1)复制原始链表的任意结点N并创建新结点N`,再把N`链接到N的后面
void CloneNodes(ComplexListNode* head) {ComplexListNode* pNode = head;while (pNode != NULL) {ComplexListNode* tmpNode = new ComplexListNode();tmpNode->val = pNode->val;tmpNode->pNext = pNode->pNext;tmpNode->pOther = NULL;pNode->pNext = tmpNode;pNode = tmpNode->pNext;}
}//2)设置结点的pOther指针对应的结点,如果原始链表上结点N的pOther指针指向S,则它对应的复制结点N`的pOther指针就指向S的下一个结点S`
void SetpOther(ComplexListNode* head) {ComplexListNode* pNode = head;while (pNode != NULL) {if (pNode->pOther != NULL)pNode->pNext->pOther = pNode->pOther->pNext;pNode = pNode->pNext->pNext;}
}//3)将链表拆分为两个链表,把奇数位置的结点用pNext指针链接起就是原始链表,偶数位置用pNext指针链接起来就是复制的链表
ComplexListNode* SplitList(ComplexListNode* head) {ComplexListNode* pNode = head;ComplexListNode* CopyHead = NULL;ComplexListNode* pCopyNode = NULL;if (pNode != NULL) {//设置新链表表头CopyHead = pNode->pNext;pNode->pNext = CopyHead->pNext;pNode = pNode->pNext;}pCopyNode = CopyHead;while (pNode != NULL) {pCopyNode->pNext = pNode->pNext;pCopyNode = pCopyNode->pNext;pNode->pNext = pCopyNode->pNext;pNode = pNode->pNext;}return CopyHead;
}ComplexListNode* CloneList(ComplexListNode* head) {CloneNodes(head);SetpOther(head);ComplexListNode* pNewHead = SplitList(head);return pNewHead;
}
//打印链表
void ShowList(ComplexListNode* head) {ComplexListNode* pNode = head;cout << "\t" << "顺序链表输出:";while (pNode != NULL) {cout << pNode->val << " " ;pNode = pNode->pNext;}cout << endl;pNode = head;cout << "\t" << "pOther指针情况:";while (pNode != NULL) {if (pNode->pOther != NULL)cout << pNode->val << "-" << pNode->pOther->val << "\t";pNode = pNode->pNext;}cout << endl;
}
int main()
{ComplexListNode* head = new ComplexListNode();ComplexListNode* node1 = new ComplexListNode();ComplexListNode* node2 = new ComplexListNode();ComplexListNode* node3 = new ComplexListNode();ComplexListNode* node4 = new ComplexListNode();head->val = 1;node1->val = 2;node2->val = 3;node3->val = 4;node4->val = 5;head->pNext = node1;	node1->pNext = node2;node2->pNext = node3;node3->pNext = node4;head->pOther = node2;node1->pOther = node3;node2->pOther = node4;cout << "复制前原始链表输出:" << endl;ShowList(head);ComplexListNode* pHead = CloneList(head);cout << "复制后原始链表输出:" << endl;ShowList(head);cout << "复制后复制链表输出:" << endl;ShowList(pHead);return 0;
}

运行结果如图所示:

 

 

 

 

 

这篇关于复杂链表的复制(随机指针)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084525

相关文章

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结