【1】题目
题目:请实现函数ComplexListNode*Clone(ComplexListNode*pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者NULL。结点的C++定义如下:
【2】思路
(1)原始链表
(2)复制原始链表的节点
(3)复制原始链表的随机指针
(4)拆分原始链表
【3】代码
#pragma once
#ifndef COMPLEXLISTCOPY_H
#define COMPLEXLISTCOPY_H
struct ComplexlistNode
{
int m_nvalue;
ComplexlistNode* m_pNext;
ComplexlistNode* m_pSibling;
};
class ComplexlistCopy
{
public:
ComplexlistCopy();
~ComplexlistCopy();
//复制原始链表的节点
void CloneNodes(ComplexlistNode *pHead);
//复制原始链表的指针
void ConnecSiblingNodes(ComplexlistNode * pHead);
//分离原始链表中被复制的节点
ComplexlistNode * ReconnectNode(ComplexlistNode *pHead);
};
#endif // !
#include "pch.h"
#include "ComplexlistCopy.h"
ComplexlistCopy::ComplexlistCopy()
{
}
ComplexlistCopy::~ComplexlistCopy()
{
}
//复制原始链表的节点
void ComplexlistCopy::CloneNodes(ComplexlistNode *pHead)
{
ComplexlistNode * pNode = pHead;
while (pHead!=nullptr)
{
//复制一个相同的节点,可能节点指向头节点的下一个节点的下一个节点
ComplexlistNode *pCloned = new ComplexlistNode();
pCloned->m_nvalue = pNode->m_nvalue;
pCloned->m_pNext = pNode->m_pNext;
//头节点指向克隆的节点,即原有的节点之间插入了一个克隆节点;
pNode->m_pNext = pCloned;
//头指针向后移动一个节点,指向可能节点的后一个节点
pNode = pCloned->m_pNext;
}
}
//复制原始链表的随机指针
void ComplexlistCopy::ConnecSiblingNodes(ComplexlistNode * pHead)
{
ComplexlistNode *pNode = pHead;
while (pNode!=nullptr)
{
ComplexlistNode *pCloned = pNode->m_pNext;
//如果当前节点存在随机指针,复制随机指针
if (pNode->m_pSibling!=nullptr)
{
//克隆节点的随机指针为头节点随机指针所指向节点的下一个节点
pCloned->m_pSibling = pNode->m_pSibling->m_pNext;
}
pNode = pCloned->m_pNext;
}
}
//分离原始链表中被复制的节点
ComplexlistNode * ComplexlistCopy::ReconnectNode(ComplexlistNode *pHead)
{
ComplexlistNode* pNode = pHead;//头节点
ComplexlistNode* pClonedHead = nullptr;//克隆的头节点
ComplexlistNode* pCloneNode = nullptr;//克隆节点
if (pNode!=nullptr)
{
//节点指针初始化
pClonedHead = pCloneNode = pNode->m_pNext;
//头节点指针指向克隆节点的下一个节点
pNode->m_pNext = pClonedHead->m_pNext;
//头节点向后移动一个
pNode = pNode->m_pNext;
}
while (pNode!=nullptr)
{
//克隆节点指向头节点的下一个节点
pCloneNode->m_pNext = pNode->m_pNext;
//更新克隆节点
pCloneNode = pCloneNode->m_pNext;
//头节点指向克隆节点的下一个节点
pNode->m_pNext = pCloneNode->m_pNext;
//头节点向后移动一个节点
pNode = pNode->m_pNext;
}
}