• 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);
        //    }
        //}
    };

     

  • 相关阅读:
    Linux基础ls命令
    Linux基础tree命令
    Java银行调度系统
    Java交通灯系统
    Java反射
    Java基础IO流
    Java多线程
    Java集合框架
    Springmvc的一些属性功能
    JS
  • 原文地址:https://www.cnblogs.com/Babylon/p/14431814.html
Copyright © 2020-2023  润新知