剑指offer-复杂链表的复制

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)       题目链接: https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&tqId=11178&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking       关键点: 重在方法:在原列表每个节点后面新增一个节点,然后将这些新增的节点拆出来,完成列表的复制。 注意:随机指针可能指向null。    
/*
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)
    {
        //null情况处理
        if(pHead == null){
            return null;
        }
        RandomListNode cur = pHead;
        //在所有节点后面增加一个新的节点,随机指针指向原链表的节点或null
        while(cur != null){
            RandomListNode tmp =cur.next;
            RandomListNode node = new RandomListNode(cur.label);
            cur.next = node;
            node.random = cur.random;
            node.next = tmp;
            cur = tmp;
        }
        cur = pHead;
        //修改素有新增节点的随机指针指向其原来指向节点的下一节点即新增节点。注意null的情况。
        while(cur != null){
            cur = cur.next;
            if(cur.random != null){
                cur.random = cur.random.next;
            }
            cur = cur.next;
        }
        cur = pHead;
        RandomListNode newhead = cur.next;
        //将新增节点从列表中拆出来,完成列表的复制
        while(cur != null){
            RandomListNode ncur = cur.next;
            cur.next = ncur.next;
            cur = cur.next;
            if(cur != null){
                ncur.next = cur.next;
            }
            ncur = ncur.next;
        }
        return newhead;
    }
}

 

上一篇:关于链表


下一篇:剑指offer-复杂链表的复制