题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
首先想到的是直接复制
1 /* 2 public class RandomListNode { 3 int label; 4 RandomListNode next = null; 5 RandomListNode random = null; 6 7 RandomListNode(int label) { 8 this.label = label; 9 } 10 } 11 */ 12 public class Solution { 13 public RandomListNode Clone(RandomListNode pHead) 14 { 15 RandomListNode cur = pHead; 16 RandomListNode head = new RandomListNode(-1); 17 RandomListNode ans = head; 18 while(cur!=null){ 19 head.next = new RandomListNode(cur.label); 20 if(cur.random!=null) 21 head.next.random = new RandomListNode(cur.random.label); 22 cur = cur.next; 23 head = head.next; 24 } 25 26 return ans.next; 27 } 28 }
方法二:
第一步,在每个节点的后面插入复制的节点。
第二步,对复制节点的 random 链接进行赋值。
第三步,拆分。
1 public RandomListNode Clone(RandomListNode pHead) { 2 if (pHead == null) 3 return null; 4 // 插入新节点 5 RandomListNode cur = pHead; 6 while (cur != null) { 7 RandomListNode clone = new RandomListNode(cur.label); 8 clone.next = cur.next; 9 cur.next = clone; 10 cur = clone.next; 11 } 12 // 建立 random 链接 13 cur = pHead; 14 while (cur != null) { 15 RandomListNode clone = cur.next; 16 if (cur.random != null) 17 clone.random = cur.random.next; 18 cur = clone.next; 19 } 20 // 拆分 21 cur = pHead; 22 RandomListNode pCloneHead = pHead.next; 23 while (cur.next != null) { 24 RandomListNode next = cur.next; 25 cur.next = next.next; 26 cur = next; 27 } 28 return pCloneHead; 29 }
来源:https://www.cnblogs.com/chyblogs/p/11445402.html