zoukankan      html  css  js  c++  java
  • 复制链表

     

     方法1 :先拼接 再拆分

    /*
    // 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 {
         //避免null.next
        public Node copyRandomList(Node head) {
            if(head == null) return null;
            Node cur  =head;
            //7  7 13 13 11 11 10 10 1 1 null
            while(cur!=null){
                Node tmp  = new Node(cur.val);
                tmp.next  =cur.next;
                cur.next   =tmp;
                cur = cur.next.next;
            }
            cur=  head;
            //修改新的链表random
            while(cur!=null){
                if(cur.random!=null){//如果cur.random==null,cur.random.next:NullPointerException
                       cur.next.random =cur.random.next;
                }
                cur =cur.next.next;
            }
            cur =head;
            Node last =head.next,so=head.next;
            //         while(xx!=null){
            //     x.next  =x.next.next;
              
            //     xx.next = xx.next.next;//xx.next已经是null,NullPointerException
                
            //     x =x.next;
            //     xx = xx.next;
            // }
              while(last.next!=null){
                cur.next  =cur.next.next; 
                last.next = last.next.next;
                cur =cur.next;
                last = last.next;
            }
                cur.next = null;//xx.next已经是null,两条链表最后都是null
                return so;//last已经是新链表的最后面,所以要返回so
        }
    }

    方法2 Map 先存下来,再遍历修改next 和random

    让每个单独的节点形成链表

    /*
    // 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 {
        HashMap<Node,Node> map  = new HashMap();
        public Node copyRandomList(Node head) {
            if(head == null) return null;
           Node cur = head;
           while(cur!=null){
               Node tmp = new Node(cur.val);
               map.put(cur,tmp);
               cur = cur.next;
           }
           cur = head;
             while(cur!=null){
               map.get(cur).next = map.get(cur.next);
                map.get(cur).random = map.get(cur.random);
               cur = cur.next;
           }
           return map.get(head);
    }
    }
  • 相关阅读:
    Cryptography中的对称密钥加解密:fernet算法探究
    HTTPS的工作原理
    最近要写的博客
    浅谈路由器软硬件架构
    组管理、权限管理、定时任务调度、磁盘分区
    matplotlib数据可视化
    tensorflow实现简单的卷积神经网络
    tensorflow实现简单的感知机
    tensorflow实现简单的自编码器
    区域生长算法(手动选取种子点)MATLAB
  • 原文地址:https://www.cnblogs.com/tingtin/p/15740852.html
Copyright © 2011-2022 走看看