面试题35. 复杂链表的复制

本文深入探讨了一种复杂链表复制的算法实现,通过在原链表中插入复制节点并调整指针,实现了对链表及其随机指针的完美复制。文章详细解释了算法步骤,包括节点复制、随机指针更新及链表拆分过程。
面试题35. 复杂链表的复制

 1 class Solution {
 2 public:
 3     Node* copyRandomList(Node* head) 
 4     {
 5         if (head == NULL)
 6         {
 7             return head;
 8         }
 9         Node *cur = head;
10         Node *copy = NULL;
11         Node *temp =    NULL;
12 
13         while (cur != NULL)
14         {
15             temp = cur->next;               //保存原结点的下一个结点
16             copy = new Node(cur->val);      //创建新结点
17             copy->next = cur->next;         //复制结点的下一个结点为原结点下一个结点
18             cur->next = copy;               //原结点下一个结点是复制结点
19             cur = temp;                     //跳到下一个原结点继续遍历
20         }
21         cur = head;
22         copy = NULL;
23         // while (cur != NULL)
24         // {
25         //     copy = cur->next->next;         //原结点下一个结点
26         //     //当前复制结点,找到下一个复制结点
27         //     cur->next->next = (copy != NULL)? copy->next:NULL;    
28         //     //当前复制结点为当前原结点的自由结点的下一个结点  A-a-B-b-C-c-null;
29         //     cur->next->random = (cur->random != NULL)? cur->random->next:NULL;
30         //     cur = copy;
31         // }
32         while(cur != NULL)
33         {
34             copy = cur->next;
35             if(cur->random)
36                 copy->random = cur->random->next;
37             else
38                 copy->random = NULL;
39             cur=copy->next;
40         }
41         cur = head;
42         copy = head->next;
43         Node *copy_cur = head->next;
44         while(cur != NULL)
45         {
46             cur->next = cur->next->next;
47             cur = cur->next;
48             if (copy_cur->next != NULL)
49             {
50                 copy_cur->next = copy_cur->next->next;
51                 copy_cur = copy_cur->next;
52             }
53         }
54         return copy;
55     }
56 };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值