25复杂链表的复制

本文详细介绍了如何复制一种特殊的复杂链表,这种链表除了包含指向下一个节点的指针外,还有一个指向任意节点的特殊指针。文章通过三个步骤解释了复制过程:首先复制链表中的所有节点;其次调整新节点的特殊指针;最后拆分链表得到完整的复制结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 //复杂链表的复制
 2 //输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
 3 //
 4 //思路:拷贝链表的结点,需要根据已知链表的结点的值,创建一个新的结点
 5 struct RandomListNode
 6 {
 7     int label;
 8     struct RandomListNode* next, *random;
 9     RandomListNode(int x):label(x), next(NULL), random(NULL)
10     {
11 
12     }
13 };
14 class Solution
15 {
16 public:
17     RandomListNode* Clone(RandomListNode* pHead)
18     {
19         if (pHead == NULL)
20         {
21             return NULL;
22         }
23         ////第一步,创建结点然后并复制整个链表的结点---复制链表,需要遍历,因而需要创建链表的头结点
24         RandomListNode* pNode=pHead;
25         while(pNode != NULL)
26         {
27             RandomListNode* pCloned = new RandomListNode(pNode->label);
28             pCloned->next = pNode->next;
29             pNode->next = pCloned;
30             pNode = pCloned->next;
31         }
32          //若原始链表上的结点N的m_pSibling指向S,则它对应的复制结点N'的m_pSibling指向S的下一个结点S'
33         //第二步--再次对复制链表进行遍历
34         RandomListNode* pNode1 = pHead;
35         while(pNode1 != NULL)
36         {
37             RandomListNode* pCloned = pNode1->next;
38             if (pNode1->random != NULL)
39             {
40                 pCloned->random = pNode1->random->next;
41             }
42             pNode1 = pCloned->next;
43         }
44         //第三步,将第二步得到的链表拆成两个链表,即奇数位置和偶数位置
45         RandomListNode* pTmp = NULL;
46         RandomListNode* pCurrentHead = pHead;
47         RandomListNode* pClonedHead = pHead->next;
48         //对复制链表进行拆分
49         //-首先再循环备份两个链表的头结点,
50         //然后循环判断条件就是头结点的下一个结点是否为NULL;
51         //先备份下一个要遍历的结点,然后再做操作;再将备份结点改编成当前要处理的结点。
52         while(pCurrentHead->next)
53         {
54             pTmp = pCurrentHead->next;
55             pCurrentHead->next = pTmp->next;
56             pCurrentHead = pTmp;
57         }
58         return pClonedHead;
59     }
60 };

 

转载于:https://www.cnblogs.com/maleyang/articles/7426751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值