剑指Offer,编程心得--复杂链表的复制

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

解题思路:

遍历节点,(创建子链)每访问一个节点A,将该节点的复制节点A’放置在A的后一个;(更新子链中random)然后重新遍历一次链表,将复制节点A’的random指针通过A.random.next进行更新;(拆分子母链),将新旧链表拆开成两个独立的链表。

Java代码

import java.util.ArrayList;

public class Solution {
    public RandomListNode Clone(RandomListNode pHead){
        // 三步走,复制节点,更新random节点,将新旧链表拆分
        if(pHead==null) return null;
        RandomListNode p=pHead;
        RandomListNode q=pHead.next;
        while(p!=null){
            RandomListNode node=new RandomListNode(p.label);
            p.next=node;
            node.next=q;
            p=q;
            q=p.next;
        }
        p=pHead;
        //q=pHead.next;
        while(p!=null){
            p.next.random= p.random==null?null:p.random.next;
            p=p.next.next;   
        }
        
        RandomListNode head=pHead.next;
        p=pHead;
        while(p!=null){
            RandomListNode clone=p.next;
            p.next=clone.next;
            clone.next=clone.next==null?null:clone.next.next;
            p=p.next;
            
        }
        return head;
    }
}

 

Python代码:

def Clone(self, pHead):
        # write code here
         
        head = pHead
        p_head = None
        new_head = None
         
        random_dic = {}
        old_new_dic = {}
         
        while head:
            node = RandomListNode(head.label)
            node.random = head.random
            old_new_dic[id(head)] = id(node)
            random_dic[id(node)] = node
            head = head.next
             
            if new_head:
                new_head.next = node
                new_head = new_head.next
            else:
                new_head = node
                p_head = node
                 
        new_head = p_head
        while new_head:
            if new_head.random != None:
                new_head.random = random_dic[old_new_dic[id(new_head.random)]]
            new_head = new_head.next
        return p_head

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值