剑指offer25 复杂链表的复制


剑指offer

25 复杂链表的复制


题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

思路

  • 第一步,在原节点后面创建一个相同的节点,其实就是链表插入的过程;

insert same node

  • 第二步,遍历克隆的节点,让它的random等于原来的随机的next,也就是下一个节点;

copy random pointer

  • 第三步,遍历整个克隆完毕的链表,让当前点指向下面隔一个的点.

split

代码

/*
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)
    {
        while(pHead==null)return null;
        RandomListNode cur = pHead;
        // insert same node
        while(cur!=null){
            RandomListNode cloneNode = new RandomListNode(cur.label);
            cloneNode.next = cur.next;
            cur.next = cloneNode;
            cur = cloneNode.next;
        }
        // insert random pointer
        cur = pHead;
        while(cur!=null){
            RandomListNode cloneNode2 = cur.next;
            if(cur.random!=null)        // random pointer is possible null
                cloneNode2.random = cur.random.next;
            cur = cloneNode2.next;
        }
        // split
        cur = pHead;
        RandomListNode resultHead = cur.next;
        while(cur.next!=null){
            RandomListNode cloneNode3 = cur.next;
            cur.next = cloneNode3.next;
            cur = cloneNode3;    // move one node once, split to two RandomListNode.
        }
        return resultHead;
    }
}

reference

click here


文章作者: Hailong Gao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Hailong Gao !
评论
  目录