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' 最后将两个链表分离出来即可,返回新链表的头结点。