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;
        }
    }

  • 相关阅读:
    判断文件结束,feof……
    第五篇 分治思想(例子待加)
    第四篇 枚举思想
    第三篇 贪心思想
    第二篇 递归思想
    第一篇 递推思想
    爬虫系列
    整数划分问题
    html中a标签做容器的问题
    H5学习小结——div+css创建电子商务静态网页
  • 原文地址:https://www.cnblogs.com/ttzz/p/13303703.html
Copyright © 2011-2022 走看看