剑指 Offer 35. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:
示例 1:
![](https://img2022.cnblogs.com/blog/1402646/202207/1402646-20220713174826670-1939653822.png)
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
![](https://img2022.cnblogs.com/blog/1402646/202207/1402646-20220713174833377-1921437586.png)
输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:
![](https://img2022.cnblogs.com/blog/1402646/202207/1402646-20220713174838077-1597236134.png)
输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
示例 4:
输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。
提示:
-10000 <= Node.val <= 10000
Node.random 为空(null)或指向链表中的节点。
节点数目不超过 1000 。
用一个二维数组记录对应random的对应即可
注意head == nullptr时,直接返回nullptr,别返回没开辟空间的指针
/* // 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) { int corres[1100]; Node* node[1010]; if(head == nullptr) return nullptr; Node* p = head; int i = 0, n = 0; while(p) { if(p->random == nullptr) corres[i] = -1; else { Node* t = head; int j = 0; while(t) { if(p->random == t) { corres[i] = j; break; } t = t->next; j++; } } node[i] = new Node(p->val); p = p->next; i++; } n = i; i = 0; p = head; while(p) { if(i < n - 1) node[i]->next = node[i + 1]; else node[i]->next = nullptr; if(corres[i] == -1) node[i]->random = nullptr; else node[i]->random = node[corres[i]]; i++; p = p->next; } return node[0]; } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。