c_cpp 给出链表,使得每个节点包含一个附加的随机指针,该指针可以指向列表中的任何节点或为空。返回

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给出链表,使得每个节点包含一个附加的随机指针,该指针可以指向列表中的任何节点或为空。返回相关的知识,希望对你有一定的参考价值。

struct ListNode {
    int val;
    ListNode *next, *rand
    ListNode(int v) : val(v), next(NULL), rand(NULL) {}
}

ListNode *deep_copy_list_with_random_pointer(ListNode *head) {
    if(!head) return NULL;
    unordered_map<ListNode*, ListNode*> mp;
    ListNode *p = head;
    ListNode *dum = new ListNode(-1);
    ListNode *q = dum;
    // step1: deal with "next" pointers
    while(p) {
        ListNode *t = new ListNode(p->val);
        q->next = t;
        mp[p] = t;
        q = q->next;
        p = p->next;
    }
    // step2: deal with "rand" pointers
    p = head;
    q = dum->next;
    while(p) {
        if(p->rand == NULL) q->rand = NULL;
        else q->rand = mp[p->rand];
        p = p->next;
        q = q->next;
    }
    /* concise version of step2
    for(p = head; p; p = p->next) {
        if(p->rand == NULL) mp[p]->rand = NULL;
        else mp[p]->rand = mp[p->rand];
    }
    */
    return dum->next;
}

//==========================================

ListNode* clone_list_with_random_pointer(ListNode *head) {
    if(!head) return NULL;
    ListNode *clone_head = new ListNode(head->data);
    
    unordered_map<ListNode*, ListNode*> mp;
    mp[head] = clone_head;
    
    ListNode *p1 = head->next, *p2 = clone_head; // did not use dummy node, so the code is a little bit longer
    
    for(; p1; p1 = p1->next) {
        p2->next = new ListNode(p1->data);
        p2 = p2->next;
        mp[p1] = p2;
    }
    
    for(ListNode *p1 = head; p1; p1 = p1->next) {
        if(p1->random != NULL) {
            mp[p1]->random = mp[p1->random];
        }
    }
    return clone_head;
}


以上是关于c_cpp 给出链表,使得每个节点包含一个附加的随机指针,该指针可以指向列表中的任何节点或为空。返回的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode练习(Python):链表类:第86题:分隔链表:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点

数组与链表的优缺点

LintCode Python 简单级题目 链表求和

c_cpp 在Doubly链表中插入一个节点 - GeeksforGeeks

Leetcode练习(Python):哈希表类:第138题: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的 深拷贝。 我们用一个

c_cpp 链表节点的小练习。