zoukankan      html  css  js  c++  java
  • 138. 复制带随机指针的链表

    三步走方案

    第一步:原链表基础上每个节点后新建一个完全一致的辅助节点,例如1->2->3,

    调整后为1->1^->2->2^->3->3^

    第二步:将辅助节点的random节点赋值为原节点random的next,比较绕口,这里举个例子

    比如原节点1的random节点为3,此时1^的random也是3,但我们将3^赋值过去,使得辅助节点1^的

    随机节点也为辅助节点

    第三步:经过第二步的调整,所有辅助节点构成的链表即为所得,但此时原节点与辅助节点仍在同一链表上

    因此我们需要将其拆分开。

    时间O(n),空间O(n)(这里的n主要是开辟结果链表的空间,除此之外空间占用为O(1))

     1     public Node copyRandomList(Node head) {
     2         if(head==null){
     3             return head;
     4         }
     5 
     6         Node p = head;
     7         // 第一步:原链表基础上每个节点后新建一个完全一致的辅助节点
     8         while(p!=null){
     9             Node newNode = new Node(p.val);
    10             newNode.next=p.next;
    11             p.next = newNode;
    12             p=newNode.next;
    13         }
    14         p=head;
    15         // 第二步:将辅助节点的random节点赋值为原节点random的next(注意随机节点可能为空)
    16         while(p!=null){
    17             if(p.random!=null){
    18                 p.next.random=p.random.next;
    19             }
    20             p=p.next.next;
    21         }
    22 
    23         Node res = new Node(-1);
    24         Node temp=res;
    25         p=head;
    26         // 第三步,拆分原链表
    27         while(p!=null){
    28             temp.next = p.next;
    29             p.next = temp.next.next;
    30             temp=temp.next;
    31             p=p.next;
    32         }
    33         return res.next;
    34     }
    争取早日不再是一只菜鸡
  • 相关阅读:
    21 viewPager--- hzScrollView ----llContainer
    21 ViewPager RadioGroup
    CLEAR REFRESH FEEE的区别
    在ALV中更新数据库表
    cl_gui_cfw=>flush
    cl_gui_cfw=>dispatch
    数据库表-DD01L DD02L DD03L-保存数据表和域的消息
    SAP 锁机制
    ABAP 搜索帮助
    SAP Basis常用事务代码
  • 原文地址:https://www.cnblogs.com/jchen104/p/14810730.html
Copyright © 2011-2022 走看看