题目:请实现函数复制一个复杂链表。在复杂链表中,每个节点除了有一个pNext指针指向下一个节点,还有一个pSibling指针指向链表中的任意节点或者nullptr。
最高效的解题思路:进行三次遍历链表即可,第一次遍历,根据原始链表的每个节点N创建对应的N‘。把N’链接在N的后面。每二次遍历,根据节点N的pSibling指针,构建N‘的pSibling指针。第三次遍历,进行拆链。代码如下所示:
#include<iostream>
using namespace std;
struct LinkNode {
int val;
LinkNode* pNext;
LinkNode* pSibling;
LinkNode(int x):val(x),pNext(nullptr),pSibling(nullptr){}
};
LinkNode* cloneLink(LinkNode* head) {
if (!head)
return head;
LinkNode* cur = head;
//在原链的基础上进行复制。并续接链
while (cur) {
LinkNode* tmp = new LinkNode(cur->val);
tmp->pSibling = cur->pSibling;
tmp->pNext = cur->pNext;
cur->pNext = tmp;
cur = tmp->pNext;
}
cur = head->pNext;
//修正copy链的pSibling所指向节点
while (cur) {
if (cur->pSibling)
cur->pSibling = cur->pSibling->pNext;
if (cur->pNext)
cur = cur->pNext->pNext;
else
cur = cur->pNext;
}
return head;
}
LinkNode* separateLink(LinkNode* head) {
if (!head)
return head;
LinkNode* cur1 = head, *cur2 = head->pNext;
LinkNode* head2 = head->pNext;
while (cur2) {
if (cur2->pNext) {
cur1->pNext = cur2->pNext;
cur2->pNext = cur2->pNext->pNext;
cur1 = cur1->pNext;
cur2 = cur1->pNext;
}
else {
cur1->pNext = nullptr;
cur2->pNext = nullptr;
cur2 = cur2->pNext;
}
}
return head2;
}
LinkNode* copyComplexLink(LinkNode* root) {
if (!root)
return root;
cloneLink(root);
return separateLink(root);
}
//验证环节
void traverseLink(LinkNode* root) {
if (!root)
return;
cout << root->val << " ";
traverseLink(root->pNext);
}
int main() {
LinkNode a(9), b(7), c(5), d(3), e(1);
a.pNext = &b;
b.pNext = &c;
c.pNext = &d;
d.pNext = &e;
a.pSibling = &c;
b.pSibling = &e;
d.pSibling = &b;
LinkNode* cpLink = copyComplexLink(&a);
traverseLink(cpLink);
return 0;
}