復雜鏈表的復制
輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果為復制后復雜鏈表的head。
Paste_Image.png
代碼如下:
public class ComplexListCopy {
public static RandomListNode clone(RandomListNode pHead){
if(pHead == null){
throw new NullPointerException();
}
RandomListNode pCur = pHead;
RandomListNode pNext = pCur.next;
//復制
while(pNext != null){
pCur.next = new RandomListNode(pCur.label);
pCur.next.next = pNext;
pCur = pNext;
pNext = pNext.next;
}
//如果pNext==null,把pCurr.next指向他的復制品
pCur.next = new RandomListNode(pCur.label);
//構造random
pCur = pHead;
while(pCur != null){
if(pCur.random != null){
pCur.next.random = pCur.random.next;
}
pCur = pCur.next.next;
}
//拆分鏈表
pCur = pHead;
RandomListNode cHead = pCur.next;
pNext = pCur.next.next;
RandomListNode cTem = cHead;
while(pNext != null){
//當前的下一個指向pNext
pCur.next = pNext;
//復制品的下一個指向pNext.next(pNext存在,必然pNext.next存在(是pNext的復制品))
cTem.next = pNext.next;
//把cTem指向cTem.next
cTem = cTem.next;
//pCur指向pNext
pCur = pNext;
//pNext指向pNext.next.next(一個next是他的復制,再next才是實際上的next)
pNext = pNext.next.next;
}
//不要漏掉這個,不然原鏈表最后會出現一個復制品
pCur.next = null;
return cHead;
}
//測試數據
public static void main(String[] args) {
// TODO Auto-generated method stub
RandomListNode root = new RandomListNode(1);
RandomListNode root2 = new RandomListNode(2);
RandomListNode root3 = new RandomListNode(3);
RandomListNode root4 = new RandomListNode(4);
RandomListNode root5 = new RandomListNode(5);
RandomListNode root6 = new RandomListNode(6);
root.next = root2;
root2.next = root3;
root3.next = root4;
root4.next = root5;
root5.next = root6;
root4.random = root6;
root.random = root6;
root3.random = root;
print(root);
RandomListNode clone = clone(root);
print(clone);
}
public static void print(RandomListNode node){
RandomListNode tem = node;
while(tem != null){
System.out.print(tem.label + " " );
if(tem.random != null){
System.out.print(tem.random.label + " ");
}
tem = tem.next;
}
System.out.println("");
}
}
class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}