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

  • 相关阅读:
    PHP基础学习笔记(一)
    安装wampserver之后,浏览器中输入localhost页面显示IIS7解决办法
    HTML5常识总结(一)
    AngularJs中的服务
    AngularJs中的directives(指令part1)
    Happy Number——LeetCode
    Binary Tree Zigzag Level Order Traversal——LeetCode
    Construct Binary Tree from Preorder and Inorder Traversal——LeetCode
    Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
    Convert Sorted Array to Binary Search Tree——LeetCode
  • 原文地址:https://www.cnblogs.com/ttzz/p/13303703.html
Copyright © 2011-2022 走看看