依旧是第四天
学会知识迁移,把看过的基础的常见的知识应用在复杂问题上
分解复杂问题,使之简单化,把复杂问题分步骤解决
复杂链表
比较复杂的链表,可能涉及树啊什么的
复杂链表的赋值
请实现函数ComplexListNode* Clone(ComplexListNode* pHead)
,复制一个复杂链表。在复杂链表中,每个节点除了有一个pNextNode
指针指向下一个节点,还有一个siblingNode
指针指向链表中的任意节点或nullptr。
如图,在复杂链表中,除了有指向下一个节点的指针(实线),还有指向任意节点的指针(虚线)
思路:
1、复制原始链表的任意节点N并创建新节点N’,再把N‘链接到N的后面
2、设置复制出来的节点的siblingNode
。假设原始链表上的N的siblingNode
指向节点S,那么其对应复制出来的N’是N的nextNode
指向的节点。设置siblingNode
之后的链表如下图:
3、把长链表拆分成两个链表:奇数位置的节点用nextNode
链接起来就是原始链表,偶数位置的节点用nextNode
链接起来就是复制出来的链表
考虑空链表、只有一个节点的链表、siblingNode
形成环的情况、siblingNode
指向自己的情况
//复杂链表结构体的声明
struct ComplexListNode
{
int value;
ComplexListNode* nextNode;
ComplexListNode* siblingNode;
};
//第一步:复制构成长链表
void CloneNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != nullptr) {
ComplexListNode* pClone = new ComplexListNode();
pClone->value = pNode->value;
pClone->nextNode = pNode->nextNode;
pNode->nextNode = pClone;
pClone->s