请实现一个函数可以复制一个复杂链表。
在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。
注意:
函数结束后原链表要与输入时保持一致。
思路:
挺有难度的一道题,没写出来。
解法一:O(n) ,使用map,记录每个节点与新节点的对应关系,那么当我们需要新节点的node -> next后者node -> random时,就需要对应旧节点的相应域值,然后使用map找到对应的新节点
解法二:O(n),省map。将复制后的节点插入原节点的后面,那么random节点就是源节点random节点的下一个节点。然后分开两个链表。
class Solution {
public:
ListNode *copyRandomList(ListNode *head) {
if(!head) return NULL;
ListNode* node = head;
map<ListNode*,ListNode*>mp;
while(node) {
ListNode* NewNode = new ListNode(node -> val);
mp[node] = NewNode;
node = node -> next;
}
node = head;
ListNode* NewHead = mp[head];
ListNode* NewNode = NewHead;
while(node) {
NewNode -> next = mp[node -> next];
if(node -> random) {
NewNode -> random = mp[node -> random];
}
NewNode = NewNode -> next;
node = node -> next;
}
return NewHead;
}
};
class Solution {
public:
ListNode *copyRandomList(ListNode *head) {
if(!head) return NULL;
ListNode* node = head;
while(node) {
ListNode* NewNode = new ListNode(node -> val);
NewNode -> next = node -> next;
node -> next = NewNode;
node = NewNode -> next;
}
node = head;
while(node) {
ListNode* NewNode = node -> next;
if(node -> random != NULL) {
NewNode -> random = node -> random -> next;
}
node = NewNode -> next;
}
node = head;
ListNode* NewHead = node -> next;
ListNode* NewNode = node -> next;
int cnt = 0;
while(node) {
cnt++;
node -> next = NewNode -> next;
node = node -> next;
if(node == NULL) NewNode -> next = NULL;
else NewNode -> next = node -> next;
NewNode = NewNode -> next;
}
return NewHead;
}
};