• 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;	*/
    	}
    };
    
    

    题目来源

  • 相关阅读:
    转 oracle catalog 库常用脚本
    转 【ORACLE】ORA-12537 问题整理
    转 Trace a specific ORA- error
    15%
    MySQL 存储过程
    MySQL 命令行客户机的分隔符
    MySQL 连接join
    MySQL 正则表达式
    MySQL 日期时间函数
    Arthas 快速入门
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/8111384.html
Copyright © 2020-2023  润新知