1,問題的描述
輸入一個複雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的head。(注意,輸出結果中請不要返回參數中的節點引用,否則判題程序會直接返回空)
2,解題思路(轉自牛客網)
(1)遍歷鏈表,複製每個節點並將該複製後的新節點放至舊節點之後,先不用管每個節點的隨機節點
(2)重新遍歷鏈表,複製舊節點的隨機指針給新節點
(3)拆分鏈表,將鏈表拆分爲原鏈表和複製後的鏈表
3,源碼
/*
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)
{
if(pHead==null) return null;
//1,遍歷鏈表,複製每個節點並將該複製後的新節點放至舊節點之後
RandomListNode currentHead = pHead;
while(currentHead!=null) {
RandomListNode copyNode = new RandomListNode(currentHead.label);
RandomListNode nextNode = currentHead.next;
copyNode.next = nextNode;
currentHead.next = copyNode;
currentHead = nextNode;
}
//2,重新遍歷鏈表,複製舊節點的隨機指針給新節點
currentHead = pHead;
while(currentHead!=null) {
currentHead.next.random = currentHead.random==null?null:currentHead.random.next;
currentHead = currentHead.next.next;
}
//3,拆分鏈表,將鏈表拆分爲原鏈表和複製後的鏈表
currentHead = pHead;
RandomListNode cloneHead = currentHead.next;
while(currentHead!=null) {
RandomListNode cloneNode = currentHead.next;
currentHead.next = cloneNode.next;
cloneNode.next = currentHead.next==null?null:currentHead.next.next;
currentHead = currentHead.next;
}
return cloneHead;
}
}