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

题目

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

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

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

分析

思路:

分析题目,其给出的链表除了next结点外还有一个random结点,其随机指向某一个结点,故称为复杂链表。所以要复制这个复杂链表,我们需要分三步走。
1)首先只复制结点的label值并将该复制后的结点接在原结点后一个,而复制的结点的next指向原结点的next结点。
在这里插入图片描述
2)复制原结点的random结点。
在这里插入图片描述
3)拆分链表,即偶数部分的结点连接起来即是复制后的链表。
在这里插入图片描述

代码:

public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        //判断链表头结点是否为空
        if(pHead==null) return null;
        //复制链表
        RandomListNode cur = pHead;
        while(cur!=null) {
            RandomListNode clo = new RandomListNode(cur.label);
            RandomListNode next = cur.next;
            cur.next = clo;
            clo.next = next;
            cur = next;
        }
        
        //复制随机结点
        cur = pHead;
        while(cur!=null) {
            cur.next.random = cur.random==null?null:cur.random.next;
            cur = cur.next.next;
        }
        
        //拆分复制后的链表,正好是偶数部分
        cur = pHead;
        RandomListNode pCloHead = pHead.next;
        while(cur!=null){
            RandomListNode clo = cur.next;
            cur.next = clo.next;
            clo.next = clo.next==null?null:clo.next.next;
            cur = cur.next;
        }
        return pCloHead;
    }
}
发布了46 篇原创文章 · 获赞 17 · 访问量 1040

猜你喜欢

转载自blog.csdn.net/weixin_42054926/article/details/103136263
今日推荐