105题 Copy List with Random Pointer

本文介绍了一种解决复杂链表深拷贝问题的方法,该链表中的节点包含一个额外的随机指针。文章详细阐述了如何在O(1)空间复杂度下完成这一任务,并提供了具体的实现步骤。

Copy List with Random Pointer

Description
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.

Challenge
Could you solve it with O(1)O(1) space?

/**
 * 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 {
    /**
     * @param head: The head of linked list with a random pointer.
     * @return: A new head of a deep copy of the list.
     */
    public RandomListNode copyRandomList(RandomListNode head) {
        // write your code here
        if(head == null){
            return null ;
        }
        copyNode(head) ;
        copyRandom(head) ;
        return splitList(head) ;
    }
    public void copyNode(RandomListNode head){
        
        while(head != null ){
            RandomListNode newNode = new RandomListNode(head.label) ;
            newNode.random = head.random ;
            newNode.next = head.next ;
            head.next = newNode ;
            head = head.next.next ;
        }
    }
    public void copyRandom(RandomListNode head){
        while(head != null){
            if(head.next.random != null){
                head.next.random = head.random.next ;
            }
            head = head.next.next ;
        }
    }
    public RandomListNode splitList(RandomListNode head){
        RandomListNode newHead = head.next ;
        while(head != null){
            RandomListNode temp = head.next ;
            head.next = temp.next ;
            head = head.next ;
            if(temp.next != null){
                temp.next = temp.next.next ;
            }    
        }
        return newHead ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值