Leetcode 138 Copy List with Random Pointer

本文介绍了一种特殊的链表结构,每个节点除了包含next指针外还包含了一个指向链表中任意节点的random指针。文章详细解释了如何通过一种巧妙的方法——将新节点插入到原节点之后的方式,实现对这种特殊链表的深拷贝。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.

一开始没懂啥是random pointer。。其实就是除了next还有一个random的指向不明。

deep copy就是完全copy一份出来。

这个题有两种思路,第一种就是按照基本复制方法复制一遍,random的就先存在map里,在遍历第二遍的时候复制random的部分。

第二种,就是把复制的new node 连接在原来的node后面,再把两个list分离。

写的是第二种。

/**
 * Definition for singly-linked list with a random pointer.
 * class RandomListNode {
 *     int label;
 *     RandomListNode next, random;
 *     RandomListNode(int x) { this.label = x; }
 * };
 */
public class Solution {
    public RandomListNode copyRandomList(RandomListNode head) {
        if(head == null){
            return null;
        }
        RandomListNode present = head;
        while(present != null){
            RandomListNode node = new RandomListNode(present.label);
            node.next = present.next;
            present.next = node;
            present = node.next;
        }
        
        present = head;
        while(present != null){
            if(present.random != null){
                present.next.random = present.random.next;
            }else{
                present.next.random = null;
            }
            present = present.next.next;
            
        }
        
        
        RandomListNode newHead = head.next;
        present = head;
        RandomListNode newnode = head.next;
        while(present!= null && newnode != null){
            present.next = present.next.next;
            if(newnode.next == null){
                return newHead;
            }
            present = present.next;
            newnode.next = newnode.next.next;
            newnode = newnode.next;
        }
        return newHead;
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值