练习题之复杂链表的复制

题目:

输入一个复杂链表(每个节点中有节点值,以及两个指针,
一个指向下一个节点,另一个特殊指针指向任意一个节点),
返回结果为复制后复杂链表的head。(注意,输出结果中
请不要返回参数中的节点引用,否则判题程序会直接返回空)

解题思路:

方法一:
直接通过原来链表来创建链表,包括随机指针。
方法二:
1.遍历链表,复制每个节点,并将复制的节点插入到原结点之后。
2.重新遍历链表,复制老结点的随机指针给新节点。
3.拆分链表,将链表拆分为原链表和复制后的链表。

方法一代码实现:

/*
public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}
*/

/*

方法一:
     通过原指针直接创建。
*/

public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead==null)
        {
            return null;
        }
        
        //根据头结点结点创建新头结点
        RandomListNode head=new RandomListNode(pHead.label);
        RandomListNode clone=head;
        if(pHead.random!=null)
        {
            //根据头结点创建新头节点的随机指针
            head.random=new RandomListNode(pHead.random.label);
        }
        
        //通过循环创建结点
        while(pHead.next!=null)
        {
            pHead=pHead.next;
            //根据原来结点创建新节点
            head.next=new RandomListNode(pHead.label);
            if(pHead.random!=null)
            {
                //根据原结点的随机指针创建新节点的随机指针
                head.next.random=new RandomListNode(pHead.random.label);
            }
            head=head.next;
        }
        return clone;
    }
}

方法二代码实现:

/*
public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}
*/

/*
解题思路:
    1.遍历链表,复制每个节点,并将复制的结点插入到原来结点后面。
    2.重新遍历链表,复制老结点的随机指针给新节点。
    3.拆分链表,将链表拆分为原链表和复制后的链表。
*/


public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        if(pHead==null)
        {
            return null;
        }
        
        RandomListNode head=pHead;
        //1.复制每个节点,并将新节点插入到原来结点的后面
        while(head!=null)
        {
            //建立新节点
            RandomListNode newNode=new RandomListNode(head.label);
         
            //将新节点插入到原结点之后
            head.next=newNode;
            newNode.next=head.next;
            
            head=newNode.next;
        }
        
        head=pHead;
        //2.遍历链表,复制老结点的随机指针给新节点
        while(head!=null)
        {
            RandomListNode nextNode=head.next;
            if(head.random!=null)
            {
                //复制后的结点的随机指针指向老结点随机指针的下一个指针
                nextNode.random=head.random.next;
            }
            head=head.next.next;
        }
        
        //3.拆分链表,将链表拆成原链表和复制后的链表
        head=pHead;
        RandomListNode p=pHead.next;
        RandomListNode cur=p;
        while(head!=null)
        {
            head.next=head.next.next;
            if(cur.next!=null)
            {
                cur.next=cur.next.next;
            }
            cur=cur.next;
            head=head.next;
        }
        return p;
    }
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值