复杂链表的复制

本文介绍了一种高效复制带有额外sibling指针的复杂链表的方法。通过在原链表中穿插复制节点并利用已有链接关系,巧妙地解决了sibling指针的复制问题,最终分离出完整的复制链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。


A:一开始想这道题毫无思路,如果蛮来,首先创建好正常的链表,然后考虑sibling这个分量,则需要O(n^2)的时间复杂度,然后一个技巧便可以巧妙的解答此题。看图便知。

首先是原始的链表

绘图1

然后我们还是首先复制每一个结点N为N*,不同的是我们将N*让在对应的N后面,即为

绘图1

然后我们要确定每一个N*的sibling分量,非常明显,N的sibling分量的next就是N*的sibling分量。

最后,将整个链表拆分成原始链表和拷贝出的链表。

代码如下:

#include <iostream>

using namespace std;
typedef struct ComplexListNode{
	int  val;
	ComplexListNode* next;
	ComplexListNode* sibing;
};

//第一步:复制next域
void copyNodes(ComplexListNode *pHead){
	if (pHead == NULL) return;
	ComplexListNode* pNode=pHead;
	while (pNode != NULL){
		ComplexListNode* pCloneNode = new ComplexListNode();
		pCloneNode->next = pNode->next;
		pCloneNode->val = pNode->val;
		pCloneNode->sibing = NULL;
		pNode->next = pCloneNode;
		pNode = pCloneNode->next;
	}
}
//第二步:复制sibing域
void copySibingNodes(ComplexListNode *pHead){
	if (pHead == NULL) return;
	ComplexListNode* pNode = pHead;
	ComplexListNode* pCloneNode;
	while (pNode != NULL){
		pCloneNode = pNode->next;
		if (pNode->sibing != NULL){
			pCloneNode->sibing = pNode->sibing->next;
		}
		pNode = pCloneNode->next;
	}
}
//第三步:把长链表拆开成两个链表,奇数位置的结点和偶数位置的结点
ComplexListNode* ReconnectNode(ComplexListNode *pHead){
	ComplexListNode* pNode = pHead;
	ComplexListNode* pCloneHead = NULL;
	ComplexListNode* pCloneNode = NULL;
	if (pNode != NULL){
		pCloneHead = pCloneNode = pNode->next;
		pNode->next = pCloneNode->next;
		pNode = pNode->next;
	}
	while (pNode != NULL){
		pCloneNode->next = pNode->next;
		pCloneNode = pCloneNode->next;
		pNode->next = pCloneNode->next;
		pNode = pNode->next;
	}
	return pCloneHead;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值