题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
因为是一个复杂链表,每个节点有一个random属性,导致无法采用简单的一个一个节点进行复制的方法。
故而将整个解法分成三步,如下所示:
解法:
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
RandomListNode pCurrent = pHead;
//1.将每个节点复制并放在原节点之后
while(pCurrent != null) {
RandomListNode temp = new RandomListNode(pCurrent.label);
temp.next = pCurrent.next;
pCurrent.next = temp;
pCurrent = temp.next;
}
//2.将每个新节点的random设置为原节点的random的next
pCurrent = pHead;
while(pCurrent != null) {
if(pCurrent.random != null) {
pCurrent.next.random = pCurrent.random.next;
}
pCurrent = pCurrent.next.next;
}
//3.将新旧链表分开,并返回新链表
RandomListNode pOrigin = pHead;
pCurrent = pHead.next;
RandomListNode pResult = pHead.next;
while(pCurrent.next != null) {
pOrigin.next = pCurrent.next;
pOrigin = pOrigin.next;
pCurrent.next = pOrigin == null ? null : pOrigin.next;
pCurrent = pCurrent.next;
}
return pResult;
}
}