zoukankan      html  css  js  c++  java
  • ※剑指offer系列19:复杂链表的复制

    这道题是典型的分治法,将一个大问题分解成几小步解决。一定要注意在使用指针的时候指针指向是否为空的问题。在指针指向时,可以将一个指向为空的指针作为赋值来写,但是空指针不能指向任何地方(指向空也不行),这点一定要记住。

      1 #include<iostream>
      2 #include<vector>
      3 using namespace std;
      4 struct RandomListNode {
      5 int label;
      6 struct RandomListNode *next, *random;
      7 /*
      8 RandomListNode(int x) :
      9 label(x), next(NULL), random(NULL) {
     10 }
     11 */
     12 };
     13 
     14 class Solution {
     15 public:
     16     RandomListNode* Clone(RandomListNode* pHead)
     17     {
     18         if (pHead == NULL)
     19             return NULL;
     20         //3步
     21         //第一步,将复杂链表复制成double
     22         nodeclone(pHead);
     23         connect(pHead);
     24         return reconnect(pHead);
     25     }
     26     void nodeclone(RandomListNode* Head)
     27     {
     28         RandomListNode*p = Head;
     29         while (p != NULL)
     30         {
     31             //插入节点
     32             //cur = p->next;
     33             RandomListNode *curnode = new RandomListNode();
     34             curnode->label = p->label;
     35             curnode->next = p->next;
     36             curnode->random = NULL;//这一句必须要写?
     37             p->next = curnode;
     38             p = curnode->next;//悬浮指针?
     39         }
     40     }
     41     void connect(RandomListNode* Head)
     42     {
     43         //第二步:将复制出的结点的随机指针指向该有的位置
     44         RandomListNode*p = Head;
     45         while (p != NULL)//在指针访问的时候,时刻注意是否为空
     46         {
     47             RandomListNode *curnode = p->next;
     48 
     49             if (p->random != NULL)
     50             {
     51                 curnode->random = p->random->next;
     52             }
     53 
     54             p = curnode->next;
     55 
     56         }
     57     }
     58     RandomListNode *reconnect(RandomListNode* Head)
     59     {
     60         //第三步:将链表拆为两部分
     61         RandomListNode*p = Head;
     62         RandomListNode *copy = p->next;
     63         while (p!= NULL)
     64         {
     65             RandomListNode *curnode = p->next;
     66             if (curnode != NULL)
     67             {
     68                 p->next = curnode->next;
     69             }
     70         
     71             p = curnode;
     72         }
     73         return copy;
     74     }
     75 };
     76 int main()
     77 {
     78     RandomListNode list[5];
     79     list[0].label = 1;
     80     list[0].next = &list[1];
     81     list[0].random = &list[2];
     82 
     83     list[1].label = 2;
     84     list[1].next = &list[2];
     85     list[1].random = &list[4];
     86 
     87     list[2].label = 3;
     88     list[2].next = &list[3];
     89     list[2].random = NULL;
     90 
     91     list[3].label = 4;
     92     list[3].next = &list[4];
     93     list[3].random = &list[1];
     94 
     95     list[4].label = 5;
     96     list[4].next =NULL;
     97     list[4].random = NULL;
     98 
     99     Solution solu;
    100     RandomListNode *re = solu.Clone(list);
    101     int count=0;
    102     while (re != NULL)
    103     {
    104         //cout << re->label << " "<<re->random->label<<",";
    105         cout << re->label<<" ";
    106         if (re->random != NULL)
    107             cout << re->random->label;
    108         cout << endl;
    109         count++;
    110         re = re->next;
    111     }
    112     //cout << endl;
    113     cout << "number of array:"<<count << endl;
    114     return 0;
    115 }

    之前把这篇写在另一个博客了,现在补回来。

  • 相关阅读:
    结合源码理解Spring MVC处理流程
    Spring Bean的生命周期分析
    面试官:给我说一下你项目中的单点登录是如何实现的?
    Java中的四种引用
    JWT实战总结
    Java读写锁的实现原理
    深入的聊聊Java NIO
    一线大厂Mysql面试题详解
    脱发、秃头防不胜防?这里有一份给码农的减压指南
    手把手教你提高代码Java运行的效率
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11320088.html
Copyright © 2011-2022 走看看