题目:
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:
输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
示例 4:
输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1 class Node { 2 int val; 3 Node next; 4 Node random; 5 6 public Node(int val) { 7 this.val = val; 8 this.next = null; 9 this.random = null; 10 } 11 } 12 13 /** 14 * @author 不乏理想的三师弟 15 * 解法一 16 */ 17 public Node copyRandomList(Node head) { 18 if(head == null) return null; 19 // 第一步:忽略random,复制一条链。 20 Node myHead = new Node(head.val); 21 Node tem = null; 22 Node tem2 = null; 23 if(head.next != null) { 24 tem = new Node(head.next.val); 25 myHead.next = tem; 26 tem2 = head.next.next; 27 } 28 while(tem2 != null) { 29 tem.next = new Node(tem2.val); 30 tem = tem.next; 31 tem2 = tem2.next; 32 } 33 /** 34 * 第二步:遍历链表,依次找出结点的random并复制 35 * 难点:确认random所指向结点的相对位置 36 * (题目要求:不只是要求值的相同,而且结点的相对位置也得相同) 37 * 手段:通过对比random所指结点的next是哪一个结点就知道其相对位置了 38 */ 39 Node temMyHead = myHead; 40 Node temHead = head; 41 Node tem3; 42 43 while(temHead != null) { 44 if(temHead.random == null) { 45 temMyHead.random = null; 46 }else { 47 // 保存当前结点random所指结点的next结点 48 tem = temHead.random.next; // tem变量的重复利用 49 // 再次遍历链表 50 tem2 = head; // tem2变量的重复利用 51 tem3 = myHead; 52 while(tem2 != null) { 53 if(tem2.next == tem) { 54 temMyHead.random = tem3; 55 break; 56 } 57 tem2 = tem2.next; 58 tem3 = tem3.next; 59 } 60 } 61 temHead = temHead.next; 62 temMyHead = temMyHead.next; 63 } 64 return myHead; 65 }