138. Copy List with Random Pointer(解法好!!!)

image.png

解法一:用hash,将新旧地址对应起来

/**
 * Definition for singly-linked list with a random pointer.
 * struct RandomListNode {
 *     int label;
 *     RandomListNode *next, *random;
 *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
 * };
 */
class Solution {
public:
    RandomListNode *copyRandomList(RandomListNode *head) {
        if(head == NULL){
            return NULL;
        }
        RandomListNode * dummy = new RandomListNode(0);
        RandomListNode * p = dummy;
        RandomListNode * h = head;
        map<RandomListNode *,RandomListNode *> hash;
        while(h){
            RandomListNode * tmp = new RandomListNode(h->label);
            cout<<h->label<<endl;
            p->next = tmp;
            p = p->next;
            tmp->random = h->random;
            hash[h] = tmp;
            h = h->next;
        }
        p  = dummy->next;
        while(p){
            if(p->random != NULL){
                p->random = hash[p->random];
            }
            p = p->next;
        }
        return  dummy->next;
    }
};

解法二:
一个更好的思路:
https://siddontang.gitbooks.io/leetcode-solution/content/linked_list/copy_list_with_random_pointer.html

image.png

要注意的事情是,可以copy,但是一定不要改变原来的序列,即以head开头的序列!!!否则会报错。最后一个while中的h,一定要有一个h->next = p->next; h = h->next的过程,一个遍历的过程!!!!!

/**
 * Definition for singly-linked list with a random pointer.
 * struct RandomListNode {
 *     int label;
 *     RandomListNode *next, *random;
 *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
 * };
 */
class Solution {
public:
    RandomListNode *copyRandomList(RandomListNode *head) {
        RandomListNode *dummy = new RandomListNode(0);
        dummy->next = head;
        RandomListNode *h = head;
        if(head == NULL) {
            return NULL;
        }
        while(h){
            RandomListNode *post = h->next;
            RandomListNode * tmp = new RandomListNode(h->label);
            tmp->random = h->random;
            h->next = tmp;
            tmp->next = post;
            h = post;
        }
        h = head->next;
        while(h){
            if(h->random != NULL) {
                h->random = h->random->next;
            }
            if(h->next == NULL){
                break;
            }
            h = h->next->next;
        }
        RandomListNode *p = dummy, *n;
        h = head;
        while(h){
            p->next = h->next;
            if(h->next == NULL){
                break;
            }
            p = p->next;
            h->next = p->next;
            h = h->next;
           
        }
        return dummy->next;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。