LeetCode-----第138题-----复制带随机指针的链表

复制带随机指针的链表

难度:中等

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的 深拷贝。 

我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

示例 4:

输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

提示:

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。

题目分析:

       这和剑指offer上的题一模一样,思路是三步走:1.创建新node,并且连接到每个node的后面;2.遍历一遍链表,将random指针连接起来;3.使用双指针分成两个链表

参考代码:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(head == NULL)
            return NULL;
        
        //复制节点
        Node* pMove = head;
        Node* temp;
        while(pMove)
        {
            temp = pMove->next;
            Node* new_node = new Node(pMove->val);
            pMove->next = new_node;
            new_node->next = temp;
            pMove = temp;
        }

        //连接random节点
        pMove = head;
        while(pMove)
        {
            //一定要注意random不为空的情况下才能指,不然的话下面指不了
            if(pMove->random != NULL)
            {
                pMove->next->random = pMove->random->next;
            }
            pMove = pMove->next->next;
        }

        //分离节点
        pMove = head;
        temp = head->next;
        Node* res = temp;
        while(pMove)
        {
           pMove->next = temp->next;
           pMove = pMove->next;
           if(pMove)
           {
               temp->next = pMove->next;
               temp = temp->next;
           } 
        }
        temp->next = NULL;//最后一个next注意指空

        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/L_smartworld/article/details/107756470
今日推荐