剑指offer:复杂链表的复制

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <stack>
#include <queue>

using namespace std;

struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};


void printList(RandomListNode* pHead)
{
	while(pHead)
	{
		cout << pHead->label << " " ;
		pHead = pHead->next;
	}
	cout << endl;
}
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
		if(NULL == pHead)
		{
			return NULL;
		}

		RandomListNode* pTempNode = NULL;
		RandomListNode* pTempHead = pHead;
		RandomListNode* pNewNode = NULL;
		RandomListNode* pNewHead = NULL;

		/* 复制一份,同时把两个链表接起来 */
		while(pTempHead)
		{
			pNewNode = new RandomListNode(pTempHead->label);
			
			pTempNode = pTempHead;
			pTempHead = pTempHead->next;

			pTempNode->next = pNewNode;
			pTempNode = pTempNode->next;
			pTempNode->next = pTempHead;
		}

		/* 把random指针接起来 */
		pTempHead = pHead;
		while(pTempHead)
		{
			if(NULL != pTempHead->random)
			{
				pTempHead->next->random = pTempHead->random->next;
			}
			pTempHead = pTempHead->next->next;
		}

		/* 把链表拆分成两个单独的链表 */
		pTempHead = pHead;
		pNewHead = pTempHead->next;
		pNewNode = pNewHead;
		pTempHead = pTempHead->next->next;

		RandomListNode* pTemp = pHead;
		while(pTempHead)
		{
			pTempNode = pTempHead;
			pTempHead = pTempHead->next->next;

			pTemp->next = pTempNode;
			pNewNode->next = pTempNode->next;
		
			pTemp = pTemp->next;
			pNewNode = pNewNode->next;
		}

		/* 需要保证原来链表不变 */
		pTemp->next = NULL;

		return pNewHead;
    }
};

int main(void)
{
	int a[7] = {4,8,6,12,16,14,10};
	vector<int> vec(a,a+7);
	Solution s;

	RandomListNode* phead = NULL;
	RandomListNode* pNode = NULL;

	phead = (RandomListNode*)malloc(sizeof(RandomListNode));
	phead->label = 1;
	phead->next = NULL;
	phead->random  =NULL;

	pNode = (RandomListNode*)malloc(sizeof(RandomListNode));
	pNode->label = 2;
	pNode->next = NULL;
	pNode->random  =NULL;

	phead->next = pNode;


	RandomListNode* pTemp = phead;
	while(pTemp)
	{
		cout << pTemp->label << " " ;
		pTemp = pTemp->next;
	}
	cout << endl;

	pTemp = s.Clone(phead);

	while(pTemp)
	{
		cout << pTemp->label << " " ;
		pTemp = pTemp->next;
	}
	cout << endl;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dmfrm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值