剑指Offer_编程题_25

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(pHead == NULL){
            return NULL;
        }
        map<RandomListNode*,RandomListNode*>tmpMap;
        RandomListNode* p1 = NULL;
        RandomListNode* p2Head = NULL;
        RandomListNode* tmpHead = pHead;
        if(tmpHead){
            p1 = new RandomListNode(tmpHead->label);
            p2Head = p1;
            tmpMap[tmpHead] = p1;
            tmpHead = tmpHead->next;
        }
        while(tmpHead){
            RandomListNode* tmp = new RandomListNode(tmpHead->label);
            p1->next = tmp;
            p1 = tmp;
            tmpMap[tmpHead] = tmp;
            tmpHead = tmpHead->next;
        }
        tmpHead = pHead;
        map<RandomListNode*,RandomListNode*>::iterator it;
        map<RandomListNode*,RandomListNode*>::iterator it_random;
        while(tmpHead){
            if(tmpHead->random){
                it = tmpMap.find(tmpHead);
                if(it != tmpMap.end()){
                    it_random = tmpMap.find(tmpHead->random);
                    if(it_random != tmpMap.end()){
                        it->second->random = it_random->second;
                    }
                }

            }
            tmpHead = tmpHead->next;
        }
        return p2Head;
    }
};

  

原文地址:https://www.cnblogs.com/grglym/p/8994911.html

时间: 2024-11-05 20:44:03

剑指Offer_编程题_25的相关文章

剑指Offer_编程题_4

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x

剑指Offer_编程题_10

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution { public: int rectCover(int number) { vector<int>vt; vt.push_back(1); vt.push_back(2); for(int i=2; i<number; i++) { vt.push_back(vt[i-1]+vt[i-2]); } return vt[n

剑指Offer_编程题_19

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. class Solution { public: vector<int> printMatrix(vector<vector<int> > matrix) { vector<int>vt;

剑指Offer_编程题之重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 原文地址:https://www.cnblogs.com/yuqiujie/p/9051667.html

剑指Offer_编程题_从尾到头打印链表

题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 创建链表相关,头插法和尾插法 关于头插法,可以next可以理解成前一个节点地址,插入顺序: 1.头节点传入,开始创建A数据,头节点的next指向A数据的内存地址,A节点的next替换成头节点的 2.头节点再传入,创建B数据,头节点的next又换成了指向B的内存地址,B节点的next替换头节点的A: 总结一下:插入时候,一直在头节点的上面插入数据,原来的数据被“顶”上去了: 头插法遍历的时候,头节点开始,一个一个往上遍历.这

剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具体的计算中,还是要将字符串转化成字符数组来进行计算. 实现两个大数的加法,要考虑到两个问题,两个数的和的位数问题,以及如何处理两个数按位相加产生的进位问题.首先两个整数相加,两个数的和的位数最多比最大的整数的位数多1:这样和的位数就确定了.对于进位问题,我的做法是先进行按位相加,相加操作完成后再按照

剑指offer编程题Java实现——面试题9斐波那契数列

题目:写一个函数,输入n,求斐波那契数列的第n项. 1 package Solution; 2 3 /** 4 * 剑指offer面试题9:斐波那契数列 5 * 题目:写一个函数,输入n,求斐波那契数列的第n项. 6 * 0, n=1 7 * 斐波那契数列定义如下:f(n)= 1, n=2 8 * f(n-1)+f(n-2), n>2 9 * @author GL 10 * 11 */ 12 public class No9Fibonacci { 13 14 public static void

剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()-1份元素poll出来,添加到另为一个为空的队列中,再把队列中最后的元素poll出来两个队列在栈不为空的情况下始终是有一个为空,另一个不为空的.push添加元素到非空的队列中,pop把非空队列的元素转移到另一个空的队列中,直到剩下最后一个元素,这个元素就是要出栈的元素(最后添加到队列中的元素). 1

剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前

题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初始化时候指向数组尾部,第一个指针指向的数字总是偶数,第二个指针指向的数字总是奇数,如果第一个指针在第二个指针之前,则交换两指针指向的元素. 1 package Solution; 2 3 /** 4 * 剑指offer面试题14:调整数组顺序是奇数位于偶数前面 5 * 题目:输入一个整数数组,实现一