zoukankan      html  css  js  c++  java
  • 剑指offer(二十五):复杂链表的复制

    刷题平台:牛客网

    题目描述

    输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
     
    思路:
    1.复制结点,将其插入到原结点的后面
    2.还原新节点的random指针
    3.拆分为两个链表
    刚开始没太明白题目的意思,其实就是,重新申请结点创建一个与之前链表一模一样的链表,难点在于random链的复制。
    遇到的问题:首先是不能返回参数pHead;其次在进行random还原的时候要进行判空处理,否则会空指针异常;最后,要将前后链表均恢复
     
    C++实现:
    class Solution {
    public:
        RandomListNode* Clone(RandomListNode* pHead)
        {
            if(!pHead) return NULL;
            RandomListNode * p = pHead;
            
            //1.复制结点,将其插入到原结点的后面
            while(p){
                RandomListNode * s = new RandomListNode(p->label);
                s->next = p->next;
                p->next = s;
                p = s->next;
            }
         //2.还原新节点的random指针 p
    = pHead; while(p){ if(p->random) p->next->random = p->random->next; p = p->next->next; }
         3.拆分为两个链表 RandomListNode
    *pCloneHead = pHead->next; RandomListNode *tmp; p = pHead; while(p->next){ tmp = p->next; p->next = tmp->next; p = tmp; } return pCloneHead; } };

     

    java实现:

    public class Solution {
        public RandomListNode Clone(RandomListNode pHead)
        {
            if(pHead == null) return null;
            RandomListNode p = pHead;
            while(p != null){
                RandomListNode newNode = new RandomListNode(p.label);
                newNode.next = p.next;
                p.next = newNode;
                p = newNode.next;
            }
            p = pHead;
            while(p != null){
                if(p.random != null){
                    p.next.random = p.random.next;
                }
                p = p.next.next;
            }
            p = pHead;
            RandomListNode q;
            RandomListNode copyHead = pHead.next;
            while(p.next != null){
                q = p.next;
                p.next = q.next;
                p = q;
            }
            return copyHead;
        }
    }

  • 相关阅读:
    如何准备面试复试(1)
    如何应对糟糕的面试官(2)
    美国:经济危机让烟民吸烟量增加
    MOV 指令的注意事项
    一个简单的ajax无刷新翻页的程序
    SQL注入漏洞全接触
    php+mysql非暴力查表的注入语句写法总结
    在你的成长过程中,有五个人非常重要
    爱就在那里,不增不减
    php的一些书籍
  • 原文地址:https://www.cnblogs.com/ttzz/p/13303703.html
Copyright © 2011-2022 走看看