1. 程式人生 > >[劍指offer] --26.複雜連結串列的複製

[劍指offer] --26.複雜連結串列的複製

題目描述

輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),

返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

解題思路

  • 遍歷連結串列,複製每個結點,如複製結點A得到A1,將結點A1插到結點A後面;
  • 重新遍歷連結串列,複製老結點的隨機指標給新結點,如A1.random = A.random.next;
  • 拆分成兩個連結串列,奇數位置為原連結串列,偶數位置為複製連結串列,注意複製連結串列的最後一個結點
    的next指標不能跟原連結串列指向同一個空結點None,next指標要重新賦值None(判定程式會認定你沒有完成複製)
public class Solution {

    public RandomListNode Clone(RandomListNode pHead) {
        if (pHead == null) {
            return null;
        }
        RandomListNode currentNode = pHead;
        //1、複製每個結點,如複製結點A得到A1,將結點A1插到結點A後面;
        while (currentNode != null) {
            RandomListNode cloneNode = new RandomListNode(currentNode.label);
            RandomListNode nextNode = currentNode.next;
            currentNode.next = cloneNode;
            cloneNode.next = nextNode;
            currentNode = nextNode;
        }
        currentNode = pHead;
        //2、重新遍歷連結串列,複製老結點的隨機指標給新結點
        while (currentNode != null) {
            currentNode.next.random = currentNode.random ==null? null : currentNode.random.next;
            currentNode = currentNode.next.next;
        }
        //3、拆分連結串列,將連結串列拆分為原連結串列和複製後的連結串列
        currentNode = pHead;
        RandomListNode pCloneHead = pHead.next;
        while (currentNode != null) {
            RandomListNode cloneNode = currentNode.next;
            currentNode.next = cloneNode.next;
            cloneNode.next = cloneNode.next==null?null:cloneNode.next.next;
            currentNode = currentNode.next;
        }
        return pCloneHead;

    }
    public class RandomListNode {
        int label;
        RandomListNode next = null;
        RandomListNode random = null;

        RandomListNode(int label) {
            this.label = label;
        }
    }
}