138. 复制带随机指针的链表

    科技2023-10-20  101

    题目描述

    截图来自官方

     

    代码

    /* // Definition for a Node. class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = null; } } */ class Solution { // 没做出来,看官方解法3,抽时间把别的解法看看 public Node copyRandomList(Node head) { if(head==null){ return null; } Node temp=head; // 先将每个节点复制一个跟在原来的每个节点后面 while(temp!=null){ Node newNode=new Node(temp.val); newNode.next=temp.next; temp.next=newNode; temp=newNode.next; } //参考原节点的random指向,将每个新节点的random指向正确位置 temp=head; while(temp!=null){ // if(temp.random!=null){ // temp.next.random=temp.random.next; // }else{ // temp.next.random=null; // } // 用三元表达式替换 temp.next.random=(temp.random!=null)?temp.random.next:null; temp=temp.next.next; } // 断链表,将新节点依次和旧节点断开并连接成一条新链表 Node newHead=head.next; Node oldHead=head; temp=newHead; while(temp!=null){ // // 看题目要求不要求保存原链表的结构了,不保存会报错。如果不要求保存这样写就行了,原来的就不用管了。 // if(temp.next!=null){ // temp.next=temp.next.next; // temp=temp.next; // }else{ // break; // } // 要求恢复原来的链表。则生成新链表的同时恢复旧的 if(temp.next!=null){ oldHead.next=temp.next; temp.next=temp.next.next; temp=temp.next; oldHead=oldHead.next; }else{ // 将原链表的最后一个节点的next手动置为null oldHead.next=null; break; } } return newHead; } }

     

     

     

    Processed: 0.013, SQL: 8