题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
题目链接:
package com.sunshine.OFFER66_SECOND; public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } }
package com.sunshine.OFFER66_SECOND; import org.junit.Test; public class A25_Clone { @Test public void test() { RandomListNode n1 = new RandomListNode(1); RandomListNode n2 = new RandomListNode(2); RandomListNode n3 = new RandomListNode(3); RandomListNode n4 = new RandomListNode(4); RandomListNode n5 = new RandomListNode(5); n1.next = null; n2.next = n3; n3.next = n4; n4.next = n5; n1.random = n1; n2.random = n5; n3.random = null; n4.random = n2; n5.random = null; //1,2,3,4,5,3,5,#,2,# RandomListNode tmp = n1; while (tmp != null) { System.out.println(tmp + " " + tmp.label + " random: " + (tmp.random == null ? "null" : tmp.random.label)); tmp = tmp.next; } System.out.println("--------------"); RandomListNode clone = Clone(n1); while (clone != null) { System.out.println(clone + " " + clone.label + " random: " + (clone.random == null ? "null" : clone.random.label)); clone = clone.next; } } public RandomListNode Clone(RandomListNode pHead) { if (null == pHead) { return null; } RandomListNode cur = pHead; while (cur != null) { RandomListNode tmp = new RandomListNode(cur.label); RandomListNode next = cur.next; cur.next = tmp; tmp.next = next; cur = next; } cur = pHead; while (cur != null) { RandomListNode next = cur.next; if (cur.random == null) { next.random = null; } else { next.random = cur.random.next; } cur = next.next; } cur = pHead; RandomListNode newHead = pHead.next; RandomListNode ans = pHead.next; while (cur != null) { cur.next = cur.next.next; newHead.next = newHead.next == null ? null : newHead.next.next; cur = cur.next; newHead = newHead.next; } return ans; } }