zoukankan      html  css  js  c++  java
  • 剑指offer 复杂链表的复制

    题目:

      输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

    深拷贝与浅拷贝:

      (1)深拷贝(Deep Copy),类似于我们常用的复制粘贴,是指在拷贝目标时会另外创造一个一模一样的对象,新对象与元对象不共享内存,修改新对象也不会改到原对象。

      (2)浅拷贝(Shallow Copy),只复制指向某个对象的指针,而不是复制对象本身,新旧对象共享一块内存。

    代码:

     1 /*
     2 struct RandomListNode {
     3     int label;
     4     struct RandomListNode *next, *random;
     5     RandomListNode(int x) :
     6             label(x), next(NULL), random(NULL) {
     7     }
     8 };
     9 */
    10 class Solution {
    11 public:
    12     RandomListNode* Clone(RandomListNode* pHead)
    13     {
    14         if(!pHead) return NULL;
    15         RandomListNode* cur = pHead;
    16         //复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面
    17         while( cur ){
    18             RandomListNode* list = new RandomListNode(cur->label);
    19             list->next = cur->next;
    20             cur->next = list;
    21             cur = list->next;
    22         }
    23         //重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next
    24         cur = pHead;
    25         while( cur ){
    26             if(cur->random)
    27                 cur->next->random = cur->random->next;
    28             cur = cur->next->next;
    29         }
    30         //拆分链表,将链表拆分为原链表和复制后的链表
    31         cur = pHead;
    32         RandomListNode* CloneList = pHead->next;
    33         RandomListNode* tmp;
    34         while( cur->next ){
    35             tmp = cur->next;
    36             cur->next = tmp->next;
    37             cur = tmp;
    38         }
    39         return CloneList;
    40     }
    41 };

    我的笔记:

    注意:本题的含义是在拷贝之后,既不改变原链表,又要返回拷贝后的链表。因此在最后拆分的步骤中可见是 A 与 A' 的地址交换更替,下面对该部分详细阐述:

    • 第一次循环时,*cur 指向 A 的地址(即链表list1 的头地址), *tmp 指向 A’ 的地址(即链表list2 的头地址);
    • 执行 cur->next = tmp->next,即将 cur->next 指针 指向  tmp->next 指针所指向的 B 地址,相当于在 链表list1 中将 A' 删除;
    • 执行 cur = tmp,即将 cur 指针指向 链表list2 的头地址;
    • 第二次循环时,就是以 链表list2 的头地址开始,删除掉原链表的元素。

    拷贝部分参考:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/lian-biao-de-shen-kao-bei-by-z1m/

  • 相关阅读:
    js--数组中的最值
    js--数组合并并且去重
    js---数组去重的方法总结???
    input 输入框又被输入法遮挡啦
    使用装饰者模式改善既有代码
    简易的 webpack + vue 完成本地化数据 mock
    vue 数据持久化(刷新保存数据)的探索
    JavaScript await 与 promise 的纠葛
    javascript 函数的暂停和恢复
    Symbol 小妙处
  • 原文地址:https://www.cnblogs.com/john1015/p/12990152.html
Copyright © 2011-2022 走看看