劍指 Offer - 25:複雜連結串列的複製
阿新 • • 發佈:2018-12-18
題目描述
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。
注意:輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空題目連結:https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba
解題思路
1、複製每個節點,到源結點的 next 處;
2、重新遍歷連結串列,調整 cloneNode 的 random 指向;
3、拆分連結串列,返回複製連結串列
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
if (pHead == null) return pHead;
RandomListNode curNode = pHead;
// 1. 複製每個節點,到源結點的 next 處
while (curNode != null) {
RandomListNode cloneNode = new RandomListNode(curNode. label);
RandomListNode nextNode = curNode.next;
curNode.next = cloneNode;
cloneNode.next = nextNode;
curNode = nextNode;
}
// 2. 重新遍歷連結串列,調整 cloneNode 的 random 指向
curNode = pHead;
while (curNode != null) {
curNode. next.random = (curNode.random == null ? null : curNode.random.next);
curNode = curNode.next.next;
}
// 3. 拆分連結串列
curNode = pHead;
RandomListNode cloned = pHead.next;
while (curNode != null) {
RandomListNode cloneNode = curNode.next;
curNode.next = cloneNode.next;
cloneNode.next = (cloneNode.next == null ? null : cloneNode.next.next);
curNode = curNode.next;
}
return cloned;
}
}