leetcode138 - 랜덤 포인터가 달린 체인 시계의 깊은 복사

제목.


체인 테이블을 지정합니다. 각 노드는 추가로 추가된 무작위 바늘을 포함합니다. 이 바늘은 체인 테이블의 모든 노드나 빈 노드를 가리킬 수 있습니다.
이 체인 시계의 깊은 복사본을 되돌려 달라고 요구하다.

코드 난점

  • 맵 가vector를 활용하여 시간제한 초과
  • 맵 2개로 7%
  • 만 처치
  • 코드1에서 코드는 하나의 맵을 교묘하게 활용하고 복사 전후의 체인 테이블을 깊이 있게 저장한다
  • node_map[cur]->next = node_map[cur->next];node_map[cur]->random = node_map[cur->random];의 운용이 가장 교묘하다. 한 맵이 원래의 체인 시계의next와random을 모두 새 체인 시계로 복사했다.
  • 코드 2에서 맵으로 노드를 더 빨리 복제하지 않고 복제 노드를 원 노드 뒤에 연결한다. 예를 들어 A->B->C가 A->A'->B->B'->C->C'로 바뀐다.노드 random 값을 설정합니다.복제 체인 시계를 원 체인 시계에서 분리하다.

  • 코드 1

    /*
    // 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) {
            std::map<Node* ,Node*> node_map;
             //1.     ,      key,      value   map 
            if(head == NULL) return head;
            Node *cur = head;
            Node *copy = NULL;
            while(cur){
                copy = new Node(cur->val);
                node_map[cur] = copy;
                cur = cur->next;
            } 
             //2.     next random  
            cur = head;
            while(cur){
                node_map[cur]->next = node_map[cur->next];
                node_map[cur]->random = node_map[cur->random];
                cur = cur->next;
            }
            return node_map[head];
    
            
        }
    };
    

    코드 2

    /*
    // 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 head;
            //1.    
            Node *node = head;
            while(node){
                Node *copy = new Node(node->val,NULL,NULL);
                copy->next = node->next;
                node->next = copy;
                node = node->next->next;
                
            }
            //2.  random
            node = head;
            while(node){
                if(node->random){
                    node->next->random = node->random->next;
                }
                node = node->next->next;
                
            }
            //3.    
            node = head;
            Node *copy = head->next;
            Node *re_ptr = copy;
            while(node){
                node->next = node->next->next;
                if(copy->next){
                    copy->next = copy->next->next;
                }
                node = node->next;
                copy = copy->next;
    
            }
            return re_ptr;
    
            
        }
    };
    

    좋은 웹페이지 즐겨찾기