剑指Offer——面试题35:复杂链表的复制

面试题35:复杂链表的复制
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。
在这里插入图片描述

解决方案:

第一步:复制原始链表的任意节点N并创建新节点N’,再把N’链接到N的后面。

在这里插入图片描述

第二步:如果原始链表上的节点N的 sibling 指向S,则对应的复制节点N’的 sibling 指向S的复制节点S’。

在这里插入图片描述

第三步:把第二步得到的链表拆分成两个链表,奇数位置上的节点组成原始链表,偶数位置上的节点组成复制出来的链表。

在这里插入图片描述

#include<iostream>
using namespace std;
struct ComplexListNode {
	int value;
	ComplexListNode* next;
	ComplexListNode* sibling;
};
// 1、复制原始链表的任意节点N并创建新节点N',再把N'链接到N的后面。
void CloneNodes(ComplexListNode* pHead){
	ComplexListNode* pNode=pHead;
	while(pNode!=NULL){
		ComplexListNode* pCloned=new ComplexListNode();
		pCloned->value=pNode->value;
		pCloned->next=pNode->next;
		pCloned->sibling=NULL;
		pNode->next=pCloned;
		pNode=pCloned->next;
	}
}
// 2、如果原始链表上的节点N的 sibling 指向S,则对应的复制节点N'的 sibling 指向S的复制节点S'。
void ConnectSiblingNodes(ComplexListNode* pHead){
	ComplexListNode* pNode=pHead;
	while(pNode!=NULL){
		ComplexListNode* pCloned=pNode->next;
		if(pNode->sibling!=NULL){
			pCloned->sibling=pNode->sibling->next;
		}
		pNode=pCloned->next;
	} 
}
// 3、 把第二步得到的链表拆分成两个链表,奇数位置上的节点组成原始链表,偶数位置上的节点组成复制出来的链表。
ComplexListNode* ReconnectNodes(ComplexListNode* pHead){
	ComplexListNode* pNode=pHead;
	ComplexListNode* pClonedHead=NULL;
	ComplexListNode* pClonedNode=NULL;
	if(pNode!=NULL){
		pClonedHead=pClonedNode=pNode->next;
		pNode->next=pClonedNode->next;
		pNode=pNode->next;
	}
	while(pNode!=NULL){
		pClonedNode->next=pNode->next;
		pClonedNode=pClonedNode->next;
		pNode->next=pClonedNode->next;
		pNode=pNode->next; 
	}
	return pClonedHead;
} 
ComplexListNode* Clone(ComplexListNode* pHead){
	CloneNodes(pHead);
	ConnectSiblingNodes(pHead);
	ReconnectNodes(pHead);
}
int main() {

	return 0;
}
发布了42 篇原创文章 · 获赞 43 · 访问量 1056

猜你喜欢

转载自blog.csdn.net/qq_35340189/article/details/104427010
今日推荐