Leetcode 138. 复制带随机指针的链表

1.题目要求

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的深度拷贝。 

 

2.解题思路

(1)笔试思路(求速度,拿分数):使用哈希表

/**
 * 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) {
        /*(一对一的)哈希表map 空间O(n)*/
        
        //判空
        if(head == NULL) return NULL;
        
        //复制原链表,创建一个新链表,整个过程中两个链表是平行的,通过哈希表关联起来
        map<RandomListNode*,RandomListNode*> map;
        RandomListNode* cur = head;
        
        //创建和原链表一样的结点,利用哈希表建立原链表结点和拷贝结点的一一对应关系
        while(cur!= NULL)
        {
            RandomListNode* copy_cur = new RandomListNode(cur->label) ;
            map[cur]=copy_cur;//下标功能强大,支持任意类型,不只是int
            cur = cur->next;
        }
        
        //重新遍历一次链表,复制next和random关系       
        cur = head;//回到表头
        while(cur != NULL)
        {
            map[cur]->next= map[cur->next];
            map[cur]->random = map[cur->random];
            cur = cur->next;
        }
        return map[head];//返回拷贝的新链表的表头
    }
};


    

 

(2)面试思路(秀思维分析能力):不适用哈希表,将空间复杂度降低到O(1)。

 

例如:1——>2——>3
利用下面的这个链接结构省略hash表,建立原链表结点与拷贝的新链表结点的一一对应关系。
1——>1'——>2——>2'——>3——>3'

例如:1-next->2(原表上),由1-next->2-next->2',即可令1'-next->2'

例如:1-random->3(原表上),由1-random->3-next->3',即可令1'-random->3'

最后将两个链表分离出来即可,返回新链表的头结点。

 

posted @ 2018-11-05 15:32  Timothy_prayer  阅读(174)  评论(0编辑  收藏  举报