程序员社区

剑指Offer系列(java版,详细解析)35.复杂链表的复制

题目描述

剑指 Offer 35. 复杂链表的复制

难度中等177

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null

示例 1:

img

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

img

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

img

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

示例 4:

输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

提示:

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。

复杂节点定义如下:

public class ComplexListNode {
   
    int value;
    ComplexListNode next;
    ComplexListNode random;

    public ComplexListNode(int value) {
   
        this.value = value;
    }
}

测试用例

  • 功能测试(节点中的random指向节点自身;两个节点的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 {
   
    public Node copyRandomList(Node head) {
   
        if(head == null) return  head;
        //构建一个组合链表
        Node cur = head;
        while(cur!=null){
   
            Node tmp = new Node(cur.val); 
            tmp.next = cur.next;
            cur.next = tmp;
            cur = tmp.next;
        }
        //构建random
        cur = head;
        while(cur!=null){
   
            if(cur.random!=null)
                cur.next.random = cur.random.next;
            cur = cur.next.next;
        }
        //拆分
        Node res = head.next;
        cur = head.next;
        Node pre = head;
        while(cur.next!=null){
   
            pre.next = pre.next.next;
            cur.next = cur.next.next;
            pre = pre.next;
            cur = cur.next;
        }
        pre.next= null;
        return res;
    }
}

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 剑指Offer系列(java版,详细解析)35.复杂链表的复制

一个分享Java & Python知识的社区