剑指offer35 复杂链表的复刻
请实现一个函数可以复制一个复杂链表。
在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。
思路:
用数组依次存放链表的结点,用unordered_map存放原始结点在数组中的位置信息。然后依次连接每个结点。
AcWing-48 C++ code:
/**
* Definition for singly-linked list with a random pointer.
* struct ListNode {
* int val;
* ListNode *next, *random;
* ListNode(int x) : val(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
ListNode *copyRandomList(ListNode *head) {
if(head == NULL){
return NULL;
}
vector<ListNode *> nodes;
unordered_map<ListNode* , int> node2int;
int i = 0;
ListNode* temp = head;
while(temp){
ListNode* new_node = new ListNode(temp->val);
nodes.push_back(new_node);
node2int[temp] = i++;
temp = temp->next;
}
for(i = 0; i < nodes.size() - 1; i++){
nodes[i]->next = nodes[i + 1];
if(head->random){
nodes[i]->random = nodes[node2int[head->random]];
}
head = head->next;
}
nodes[i]->next = NULL;
if(head->random){
nodes[i]->random = nodes[node2int[head->random]];
}
return nodes[0];
}
};