[算法练习-剑指offer]题25.复杂链表的复制(Java)

题目

题号:25
题目名:复杂链表的复制

编程语言

Java

题目描述

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

初次思路

暂时理解这个题目的意思是一条链表,上面的结点会有一个next指针,还有一个random指针,这个random指针是连在链表上的一个随机一个结点的,这个是重点.

一下就能想到的就是暴力法

按逻辑来写,先完全复制next的指针做一个链表.之后重要的就是重现random指针

random指针怎么找?那我就在新老链表同时放一个指针,两个链表都有next指针了,从头开始,向后遍历结点,如果老链表指针找到了这个结点对应的random结点,那么新指针肯定也移动到了新链表同样位置的结点,那我拿新链表指向找到的这个random结点肯定是没错的

解题代码

public class Solution {
    public RandomListNode Clone(RandomListNode pHead) {
        /**
         * 暴力法
         * 首先将链表clone
         * 然后在找random
         * 找到每个random下标,逐一去指
         */
        if (pHead == null) return null;
        RandomListNode newNode = new RandomListNode(0);//虚拟头结点
        RandomListNode curr = newNode;//新链表遍历指针
        RandomListNode oldCurr = pHead;//设置旧链表遍历
        //复制next的链表
        while (oldCurr != null) {
            curr.next = new RandomListNode(oldCurr.label);//连向新创建结点
            curr = curr.next;
            oldCurr = oldCurr.next;
        }
        RandomListNode newCurr = newNode.next;//设置新链表遍历指针
        RandomListNode copy = pHead;//设置copy的指针
        while (copy!=null) {
          	//这两个指针同步后移,为了找到random结点
            RandomListNode currPHead = pHead;
            RandomListNode currNewNode = newNode.next;//新节点的遍历结点

            //复制random的指向
            while (currPHead != copy.random) {
                //找到pHead的random的位置
                currPHead = currPHead.next;
                currNewNode = currNewNode.next;
            }
            //找到了后赋值
            newCurr.random = currNewNode;
            newCurr=newCurr.next;
            copy = copy.next;
        }
        return newNode.next;
    }
}

算法练习代码我都开源在码云上,有需要的朋友可以看看

https://gitee.com/xiaoxiaoyuworkspace/offeralgorithm

猜你喜欢

转载自blog.csdn.net/qq_41522089/article/details/107623602
今日推荐