zoukankan      html  css  js  c++  java
  • leetcode_138复制带随机指针的链表

    最初版,用原node的next指向新node,从尾部开始更新random,修改了原链表结构未通过

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        Node* next;
        Node* random;
        
        Node(int _val) {
            val = _val;
            next = NULL;
            random = NULL;
        }
    };
    */
    
    class Solution {
    public:
        Node* copyRandomList(Node* head) {
            if (head == NULL) {
              return NULL;
            }
            Node *node = new Node(head->val, nullptr, nullptr);
            head->next=node;
            node->next=copyRandomList(temp);
            if(head->random!=NULL){
                node->random=head->random->next;
            }
            return node;
        }
    };

    2.新链表random完成后修改回去,尾部开始指向就失效了,结果新链表的random会指向错误,未通过

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        Node* next;
        Node* random;
        
        Node(int _val) {
            val = _val;
            next = NULL;
            random = NULL;
        }
    };
    */
    
    class Solution {
    public:
        Node* copyRandomList(Node* head) {
            if (head == NULL) {
              return NULL;
            }
            Node *node = new Node(head->val, nullptr, nullptr);
            head->next=node;
            node->next=copyRandomList(temp);
            if(head->random!=NULL){
                node->random=head->random->next;
            }
            head->next=temp;
            return node;
        }
    };

    新旧链表如果按一对一指针映射必须增加辅助空间做map,参考

    https://www.cnblogs.com/reynold-lei/p/3362614.html

     将新旧链表二合一,这样就不用多余空间了。

    3错版同二的错误,afteconnection必须在全部遍历完成后完成,否则同二一样。

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        Node* next;
        Node* random;
        
        Node(int _val) {
            val = _val;
            next = NULL;
            random = NULL;
        }
    };
    */
    
    class Solution {
    public:
        Node* copyRandomList(Node* head) {
            if (head == NULL) {
              return NULL;
            }
            //preConnection
            Node *node = new Node(head->val, head->next, nullptr);
            head->next=node;
            copyRandomList(node->next);
            //randomConnection
            if(head->random!=NULL){
                node->random=head->random->next;
            }
            //afterConnection
            head->next=node->next;
            if(node->next!=NULL){
                node->next=node->next->next;
            }
            return node;
        }
    };

    4通过版本,在完成一次递归遍历完所有节点后再拆分成两条链

    /*
    // Definition for a Node.
    class Node {
    public:
        int val;
        Node* next;
        Node* random;
        
        Node(int _val) {
            val = _val;
            next = NULL;
            random = NULL;
        }
    };
    */
    
    class Solution {
    public:
        Node* copyRandomList(Node* head) {
            if (head == NULL) {
              return NULL;
            }
            Node* node = pre_copyRandomList(head);
            //after_copyRandomList(head);
            Node* temp;
            while(head->next!=NULL){
                temp=head->next;
                head->next=head->next->next;
                head=temp;
            }
            return node;
        }
        Node* pre_copyRandomList(Node* head) {
            if (head == NULL) {
              return NULL;
            }
            //preConnection
            Node *node = new Node(head->val, head->next, nullptr);
            head->next=node;
            pre_copyRandomList(node->next);
            //randomConnection
            if(head->random!=NULL){
                node->random=head->random->next;
            }
            return node;
        }
        //void after_copyRandomList(Node* head) {
        //    //afterConnection
        //    if(head->next!=NULL){
        //        Node* node=head->next;
        //        head->next=head->next->next;
        //        after_copyRandomList(node);
        //    }
        //}
    };

     

  • 相关阅读:
    ios每日一发--Leanclude数据云存储以及登录 注册账户
    ios每日一发--仿侧边抽屉效果
    ios-自定义alertView提示框
    ios
    UIStepper 缩放:UI的使用
    UIButton 关灯小实验
    将一个字典内的内value转换为集合:返回一个数组,此数组中包含输入字典的键值对中的数组的所有元素(为NSArray添加category)
    为集合排序的三个方法
    NSMutableDictionary
    头文件导入方式
  • 原文地址:https://www.cnblogs.com/Babylon/p/14431814.html
Copyright © 2011-2022 走看看