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

方法一:

分析:

1.复制各个节点,使得原来的各个节点的next指向复制的节点

2.复制各个节点的random节点

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;
        }
    
        //1.复制链表,先不管random的指向
        RandomListNode currentNode=pHead;
        while(currentNode!=null){
            
            RandomListNode cloneNode =new RandomListNode(currentNode.label);
            RandomListNode next=currentNode.next;
            currentNode.next=cloneNode;
            cloneNode.next=next;
            currentNode=next;
        }
        //2.复制random节点
        currentNode=pHead;
        while(currentNode!=null){
            //currentNode.next.random=currentNode.random;
            currentNode.next.random=currentNode.random==null?null:currentNode.random.next;
            currentNode=currentNode.next.next;
        }
        //3.剥离除新链表
        currentNode=pHead;
        RandomListNode clonePHead=pHead.next;
        while(currentNode!=null){
            RandomListNode cloneNode=currentNode.next;
            currentNode.next=cloneNode.next;
            cloneNode.next=cloneNode.next==null?null:cloneNode.next.next;
            currentNode=currentNode.next;
            
          
        }
        return clonePHead;
    }
}

方法二:

分析:

用一个map存储node和clone的映射。迭代旧链表,将node之间的关系连接起来

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

    RandomListNode(int label) {
        this.label = label;
    }
}
*/
import java.util.*;
public class Solution {
    public RandomListNode Clone(RandomListNode pHead){
        if(pHead==null){
            return null;
        }
        HashMap<RandomListNode,RandomListNode> map=new HashMap<>();
        RandomListNode cnode=pHead;
        while(cnode!=null){
           RandomListNode clone=new RandomListNode(cnode.label);
            map.put(cnode,clone);
            cnode=cnode.next;
            }
        cnode=pHead;
        while(cnode!=null){
            map.get(cnode).next=map.get(cnode.next);
            map.get(cnode).random=map.get(cnode.random);
            cnode=cnode.next;
        }
        return map.get(pHead);
    }
    
}
发布了41 篇原创文章 · 获赞 1 · 访问量 1868

猜你喜欢

转载自blog.csdn.net/qq_38087131/article/details/105019417
今日推荐