链表拷贝的一种算法

最近看到一道有关链表复制的算法题,解法很是奇妙。

题目:已知一链表,每个节点除了有一个指向下一节点的指针外,还有一随机指针指向链表中的任意节点(可能为空,也有可能为自身),请复制一个链表,要求节点的顺序以及节点上的随机指针指向的节点位置和原链表一致。

这个题目有个很巧妙的解法,可以达到O(n)的效率,其中心思想是把原始链表和复制链表先合并为一个有固定顺序的链表然后给复制链表中每个节点的随机指针复制,最后再打断链表恢复原样。

/**********节点信息*********/
typedef struct __Node {
	int nData;
	__Node* pNext;
    __Node* pRandom;
} Node;
Node* DuplicateList(Node* pSrcListHead)
{
	if (pSrcListHead == NULL)
		return NULL;
	
	Node* pNode = pSrcListHead;
        // 将新节点插入老的链表项中
	while (pNode != NULL)
	{
		Node* pNewNode = new Node;
		pNewNode->nData = pNode->nData;
		pNewNode->pNext = pNode->pNext;
		//pNewNode->pRandom = pNode->pRandom;
		pNode->pNext = pNewNode;
		pNode = pNewNode->pNext;
    }
	
	Node* pDestListHead = pSrcListHead->pNext;
    pNode = pSrcListHead;
    // 赋给节点随机信息
    while (pNode != NULL)
    {
        pNode->pNext->pRandom = pNode->pRandom->pNext;
        pNode = pNode->pNext->pNext;
	}
    pNode = pSrcListHead;
    Node* pNode2 = pNode->pNext;
    // 将新产生的链表解链
    while (pNode != NULL)
    {
		pNode->pNext = pNode2->pNext;
		pNode = pNode->pNext;
		if (pNode)
			pNode2->pNext = pNode->pNext;
		else
			pNode2->pNext = NULL;
        pNode2 = pNode2->pNext;
    }
    return pDestListHead;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值