第一种方式:

    1. /*
    2. // Definition for a Node.
    3. class Node {
    4. public:
    5. int val;
    6. Node* next;
    7. Node* random;
    8. Node(int _val) {
    9. val = _val;
    10. next = NULL;
    11. random = NULL;
    12. }
    13. };
    14. */
    15. class Solution {
    16. public:
    17. Node* copyRandomList(Node* head) {
    18. //在原有的链表的每一个节点后面都插入一个节点
    19. Node* pt = head;
    20. while(pt)
    21. {
    22. Node* pNew = new Node(pt->val);
    23. pNew->next = pt->next;
    24. pt->next = pNew;
    25. pt= pt->next->next;
    26. }
    27. //把新插入的节点的random进行赋值
    28. pt = head;
    29. while(pt)
    30. {
    31. if(pt->random)
    32. {
    33. pt->next->random = pt->random->next;
    34. }
    35. pt = pt->next->next;
    36. }
    37. //把新链表抠出来
    38. pt = head;
    39. Node* dummy = new Node(-1);
    40. Node* newpt = dummy;
    41. while(pt)
    42. {
    43. newpt->next = pt->next;
    44. newpt = newpt->next;
    45. pt->next = newpt->next;
    46. pt = pt->next;
    47. }
    48. newpt->next = nullptr;
    49. return dummy->next;
    50. }
    51. };

    第二种,借助map,存的是新旧链表的node对

    /*
    // 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) {
            map<Node*, Node*> mp;
            Node* pt = head;
            while(pt)
            {
                mp[pt] = new Node(pt->val);
                pt = pt->next;
            }
    
            pt = head;
            while(pt)
            {
                mp[pt]->next = mp[pt->next];
                if(pt->random)
                {
                    mp[pt]->random = mp[pt->random];
                }
                pt = pt->next;
            }
            return mp[head];
        }
    };
    

    第三种,借助map,存的是旧链表的节点的idx

    /*
    // 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) {
            map<Node*, int> mp;
            vector<Node*> v;
            Node* pt = head;
            while(pt)
            {
                Node* newnode = new Node(pt->val);
                v.push_back(newnode);
                mp[pt] = v.size() - 1;
                pt = pt->next;
            }
    
    
            Node* dummy = new Node(-1);
            Node* newpt = dummy;
            pt = head;
            for(int i = 0; i < v.size(); i++)
            {
                newpt->next = v[i];
                newpt = newpt->next;
                if(pt->random)
                    newpt->random = v[mp[pt->random]];
                pt = pt->next;
            }
            // newpt->next = nullptr;
            return dummy->next;
    
    
        }
    };