剑指offer 25:复杂链表的复制--- Java实现

剑指offer每日一题算法题(java解法)

方便日后复习,从今天开始。

算法之行始于足下

[编程题]复杂链表的复制-- Java实现

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

解题思路:
1.遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面
2.重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;
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 currentNode=pHead;
        //1、复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;
        while(currentNode!=null){
            //创建一个克隆节点
            RandomListNode cloneNode = new RandomListNode(currentNode.label);
            RandomListNode nextNode=currentNode.next;// 标记A的下一个节点为A的下一个
            currentNode.next=cloneNode;   //把克隆的节点给头的下一个
            cloneNode.next=nextNode;    //把A的下一个节点给克隆的下一个,就完成了克隆节点的加入
            currentNode=nextNode;    //把当前节点给到克隆的下一个,重新循环加入克隆节点
        }
        currentNode=pHead;   //完成了图的第一步
        //2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;
        while(currentNode!=null){
            //如果随机指针不为空,则也复制给克隆节点random
            currentNode.next.random=currentNode.random==null?null:currentNode.random.next;
            //再把节点往后移给B.c.d.d...
            currentNode = currentNode.next.next;
        }
        //3、拆分链表,将链表拆分为原链表和复制后的链表
        currentNode = pHead;
        //创建克隆链表的头节点
        RandomListNode pCloneHead = pHead.next;
        //3、拆分链表,将链表拆分为原链表和复制后的链表,把复杂链表里的非克隆节点剥离出来
        while(currentNode!=null){
            RandomListNode cloneNode=currentNode.next;
            currentNode.next=cloneNode.next;  //a->b
            cloneNode.next =cloneNode.next==null?null:cloneNode.next.next;//如果b的下一个的下一个不为空,则给b的下一个
            currentNode = currentNode.next;//节点赋值到下一个
        }
        return pCloneHead;
    }
}
发布了52 篇原创文章 · 获赞 10 · 访问量 1530

猜你喜欢

转载自blog.csdn.net/jiohfgj/article/details/103145186
今日推荐