3.25 复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路: 1.先根据next复制整个链表.2.根据random指针在原始链表的位置找出random在复制的链表中对应的位置, 并建立关联.

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

class Solution {
public:
	RandomListNode* Clone(RandomListNode* pHead)
	{
		RandomListNode* head = NULL;
		do
		{
			if (NULL == pHead) {
				break;
			}
			head = new RandomListNode(pHead->label);
			RandomListNode* sourceHead = pHead;
			RandomListNode* targetHead = head;

			// 复制next
			while (NULL != sourceHead && NULL != sourceHead->next) {
				targetHead->next = new RandomListNode(sourceHead->next->label);
				targetHead = targetHead->next;
				sourceHead = sourceHead->next;
			}

			sourceHead = pHead;
			targetHead = head;

			// 复制random
			while (NULL != sourceHead) {
				if (NULL == sourceHead->random) {
					targetHead->random = NULL;
					sourceHead = sourceHead->next;
					targetHead = targetHead->next;
					continue;
				}

				RandomListNode* random = sourceHead->random;
				RandomListNode* searchStart = pHead;
				RandomListNode* node = head;
				while (searchStart != NULL && node !=NULL) {
					if (random == searchStart) {
						// 根据random在pHead中的位置 得到random在head中对应的位置
						break;
					}
					searchStart = searchStart->next;
					node = node->next;
				}

				targetHead->random = node;
				sourceHead = sourceHead->next;
				targetHead = targetHead->next;
			}

		} while (0);

		return head;
	}
};
测试

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_37518595/article/details/86489164