复杂链表的复制
题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
解题思路:
- 首先复制原来的链表,并将复制后的每一个结点插入到原来链表对应的结点后方
- 修改复制后链表中每个结点的
sibling
指针,从头到尾依次遍历这个链表,如果A->C,则A'->C'- 将原来的链表依次断链,奇数号的结点为一个链表,偶数号的结点为复制后的链表
代码:
class Solution {
public:
RandomListNode* Clone(RandomListNode *pHead) {
duplicate(pHead);
fullyconnect(pHead);
return unchain(pHead);
}
private:
void duplicate(RandomListNode *pHead);
void fullyconnect(RandomListNode *pHead);
RandomListNode* unchain(RandomListNode *pHead);
};
void Solution::duplicate(RandomListNode *pHead) {
if (pHead == nullptr) {
return;
}
RandomListNode *node;
node = pHead;
while (node != nullptr) {
// 新建一个newNode
RandomListNode *newNode = new RandomListNode(node->label);
// 将newNode插入到原来的链表里面
newNode->next = node->next;
node->next = newNode;
node = newNode->next;
}
}
void Solution::fullyconnect(RandomListNode *pHead) {
if (pHead == nullptr) {
return;
}
RandomListNode *node1 = pHead;
RandomListNode *node2 = pHead->next;
while (node1 != nullptr) {
if (node1->random != nullptr) {
node2->random = node1->random->next;
}
node1 = node2->next;
if (node1 == nullptr)
break;
node2 = node1->next;
}
}
RandomListNode* Solution::unchain(RandomListNode *pHead) {
if (pHead == nullptr) {
return nullptr;
}
RandomListNode *pHeadNew = pHead->next;
RandomListNode *node1 = pHead;
RandomListNode *node2 = pHead->next;
while (node1 != nullptr) {
node1->next = node2->next;
node1 = node1->next;
if (node1 == nullptr)
break;
node2->next = node1->next;
node2 = node2->next;
}
return pHeadNew;
}
2018.10.18
网友评论