思路
两步走,先复制next,在复制m_pSibling,时间复杂度主要花在复制m_pSibling上
有两种解法:
1.哈希表
2.原地
方法一:
class node{
public:
int value;
node* next;
node* sibling;
node(int _value){
value = _value;
}
}
void copy(node* root){
unordered_map<node*,node*> map;
node* temp = root;
node* newNode = new node(temp->value);
int sign = 1;
node* head;
while(temp != NULL){
newNode = new node(temp->value);
map[temp] = newNode;
newNode = newNode->next;
temp = temp->next;
if(sign == 1){
sign = 0;
head = newNode;
}
}
temp = root;
node* temp2 = head;
while(temp != NULL){
temp2->sibling = map[temp];
temp2 = temp2->next;
temp = temp->next;
}
}
方法二:
步骤一:根据原始节点N创建对应的N';
vodi CloneNodes(node* root){
node* p = root;
while(p != NULL){
node* temp = new node(p->value);
temp->next = p->next;
temp->sibling = NULL;
p->next = temp;
p = temp->next;
}
}
步骤二:
原始链表的N的sibling指向S,复制后的N'的sibling指向S'
void copySibling(node * root){
node* p = root;
while(p != NULL){
node* clone = p->next;
if(p->sibling != NULL)
clone->sibling = p->sibling->next;
pNode = clone->next;
}
}
步骤三:
链表拆分,奇数位置的是原始链表,偶数的是新链表
node* reconnectNodes(node* root){
node* p = root;
node* cloneHead = NULL;
node* cloneNode = NULL;
if(p != NULL){
cloneHead = p->next;
cloneNode = p->next;
p->next = cloneHead->next;
p = p->next;
}
while(p != NULL){
cloneNode->next = p->next;
cloneNode = cloneNode->next;
p->next = cloneNode->next;
p = p->next;
}
retur cloneHead;
}