138. Copy List with Random Pointer

Posted 小河沟大河沟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了138. Copy List with Random Pointer相关的知识,希望对你有一定的参考价值。

欢迎fork and star:Nowcoder-Repository-github

138. Copy List with Random Pointer

题目

 A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list. 

解析

  1. 在原链表的每个节点后面拷贝出一个新的节点

  2. 依次给新的节点的随机指针赋值,而且这个赋值非常容易 cur->next->random = cur->random->next

  3. 断开链表可得到深度拷贝后的新链表

  • 几个易错点:

  • 插入在当前节点前或者后要分清

  • copy random 指针->next理解,就是当前copy节点的random节点指向当前cur节点的random节点的下一个节点

  • 分离链表是否加头结点,不加也可以吧,指针分离都要连起来


/**
 * Definition for singly-linked list with a random pointer.
 * struct RandomListNode {
 *     int label;
 *     RandomListNode *next, *random;
 *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
 * };
 */

class Solution {
public:
	RandomListNode *copyRandomList(RandomListNode *head) {

		if (!head)
			return NULL;
		//if (!head->next) //bug: 这句话bug,不加才行!!!
		//{
		//	RandomListNode* copy = new RandomListNode(head->label);
		//	return copy;
		//}

		RandomListNode* cur = head;

		RandomListNode* temp = NULL;
		while (cur) //在每个节点后面copy节点
		{
			RandomListNode* newNode = new RandomListNode(cur->label); //bug 在之后插入

			temp = cur->next;
			cur->next = newNode;
			newNode->next = temp;
			
			cur = cur->next->next;
		}

		//每个节点copy random指针

		cur = head;
		while (cur) //bug 指针越界
		{
			if (cur->random)
			{
				cur->next->random = cur->random->next; //??->next
			}
			cur=cur->next->next;
		}

		// 将original list和copy list分开

		cur = head;
		RandomListNode* copyHead = new RandomListNode(0);
		RandomListNode* copy_cur = copyHead;

		RandomListNode* next = NULL;
		while (cur)
		{
			next = cur->next->next;

			copy_cur->next = cur->next;
			copy_cur = cur->next;

			cur->next = next;
			cur = next;

		}

		return copyHead->next;

		/*RandomListNode*p = NULL;
		p = head;
		RandomListNode* res = head->next;
		while (p->next != NULL)
		{
			RandomListNode* tmp = p->next;
			p->next = p->next->next;
			p = tmp;
		}
		return res;	*/
	}
};

题目来源

以上是关于138. Copy List with Random Pointer的主要内容,如果未能解决你的问题,请参考以下文章

138. Copy List with Random Pointer

138. Copy List with Random Pointer

138 Copy List with Random Pointer

138. Copy List with Random Pointer

138. Copy List with Random Pointer(js)

138. Copy List with Random Pointer