传送门 nowcoder leetcode
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针 random 指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。 注意:输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空。
C++ 代码 - nowcoder 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 class Solution {public : RandomListNode* Clone (RandomListNode* pHead) { if (pHead == nullptr ) return nullptr ; unordered_map<RandomListNode*, RandomListNode*> hash_map; for (RandomListNode* p = pHead; p != nullptr ; p = p->next) hash_map[p] = new RandomListNode (p->label); for (RandomListNode* p = pHead; p != nullptr ; p = p->next) { hash_map[p]->next = hash_map[p->next]; hash_map[p]->random = hash_map[p->random]; } return hash_map[pHead]; } };class Solution {public : unordered_map<RandomListNode*, RandomListNode*> unmap; RandomListNode* Clone (RandomListNode* pHead) { if (pHead == nullptr ) return nullptr ; RandomListNode* newHead = new RandomListNode (pHead->label); unmap[pHead] = newHead; newHead->next = Clone (pHead->next); newHead->random = nullptr ; if (pHead->random != nullptr ) { newHead->random = unmap[pHead->random]; } return newHead; } };
C++ 代码 - leetcode 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 class Solution {public : Node* copyRandomList (Node* head) { if (!head) return nullptr ; for (Node* node = head; node != nullptr ; node = node->next->next) { Node* newNode = new Node (node->val); newNode->next = node->next; node->next = newNode; } for (Node* node = head; node != nullptr ; node = node->next->next) { Node* newNode = node->next; newNode->random = (node->random != nullptr ) ? node->random->next : nullptr ; } Node* newHead = head->next; for (Node* node = head; node != nullptr ; node = node->next) { Node* newNode = node->next; node->next = node->next->next; newNode->next = (newNode->next != nullptr ) ? newNode->next->next : nullptr ; } return newHead; } };class Solution {public : Node* copyRandomList (Node* head) { if (!head) return nullptr ; copyNextNode (head); copyRandomNode (head); return splitList (head); } void copyNextNode (Node* head) { Node* node = head; while (node) { Node* temp = new Node (node->val); temp->next = node->next; node->next = temp; node = temp->next; } } void copyRandomNode (Node* head) { Node *node = head, *copyNode = head->next; while (node) { if (node->random) { copyNode->random = node->random->next; } node = copyNode->next; if (node) { copyNode = node->next; } } } Node* splitList (Node* head) { Node *node = head, *copyNode = head->next, *copyNodeHead = head->next; while (node) { node->next = copyNode->next; node = node->next; if (node) { copyNode->next = node->next; } copyNode = copyNode->next; } return copyNodeHead; } };