zoukankan      html  css  js  c++  java
  • 剑指Offer24 复杂链表的复制

      1 /*************************************************************************
      2     > File Name: 24_ComplexListClone.cpp
      3     > Author: Juntaran
      4     > Mail: JuntaranMail@gmail.com
      5     > Created Time: 2016年08月31日 星期三 14时24分35秒
      6  ************************************************************************/
      7 
      8 #include <stdio.h>
      9 #include <malloc.h>
     10 
     11 // 链表结构体
     12 struct ComplexListNode
     13 {
     14     int val;
     15     ComplexListNode* next;
     16     ComplexListNode* rand;
     17 };
     18 
     19 // 构造链表
     20 ComplexListNode* createList()
     21 {
     22     ComplexListNode* A = new ComplexListNode();
     23     ComplexListNode* B = new ComplexListNode();
     24     ComplexListNode* C = new ComplexListNode();
     25     ComplexListNode* D = new ComplexListNode();
     26     ComplexListNode* E = new ComplexListNode();
     27     A->val  = 1;
     28     A->next = B;
     29     A->rand = C;
     30     B->val  = 2;
     31     B->next = C;
     32     B->rand = E;
     33     C->val  = 3;
     34     C->next = D;
     35     C->rand = NULL;
     36     D->val  = 4;
     37     D->next = E;
     38     D->rand = B;
     39     E->val  = 5;
     40     E->next = NULL;
     41     E->rand = NULL;
     42     
     43     return A;
     44 }
     45 
     46 void* PrintComplexList(ComplexListNode* head)
     47 {
     48     while (head)
     49     {
     50         if (head->rand != NULL)
     51             printf("%d rand=%d
    ", head->val, head->rand->val);
     52         else
     53             printf("%d
    ", head->val);
     54         head = head->next;
     55     }
     56     printf("
    ");
     57 }
     58 
     59 // 复制链表,复制的接在原位置后面
     60 void CloneNodes(ComplexListNode* head)
     61 {
     62     ComplexListNode* node = head;
     63     while (node != NULL)
     64     {
     65         ComplexListNode* newNode = new ComplexListNode();
     66         newNode->val = node->val;
     67         newNode->next = node->next;
     68         newNode->rand = NULL;
     69         node->next = newNode;
     70         node = newNode->next;
     71     }
     72 }
     73 
     74 // 补充复制的链表的rand指针
     75 void AddRand(ComplexListNode* head)
     76 {
     77     ComplexListNode* node = head;
     78     while (node != NULL)
     79     {
     80         ComplexListNode* newNode = node->next;
     81         if (node->rand != NULL)
     82             newNode->rand = node->rand->next;
     83         node = newNode->next;
     84     }
     85 }
     86 
     87 // 拆分链表
     88 ComplexListNode* SplitList(ComplexListNode* head)
     89 {
     90     ComplexListNode* node = head;
     91     ComplexListNode* newHead = NULL;
     92     ComplexListNode* newNode = NULL;
     93     
     94     if (node != NULL)
     95     {
     96         newHead = newNode = node->next;
     97         node->next = newNode->next;
     98         node = node->next;
     99     }
    100     while (node != NULL)
    101     {
    102         newNode->next = node->next;
    103         newNode = newNode->next;
    104         node->next = newNode->next;
    105         node = node->next;
    106     }
    107     return newHead;
    108 }
    109 
    110 ComplexListNode* Clone(ComplexListNode* head)
    111 {
    112     CloneNodes(head);
    113     AddRand(head);
    114     return SplitList(head);
    115 }
    116 
    117 int main()
    118 {
    119     ComplexListNode* test = createList();
    120     PrintComplexList(test);
    121     
    122     ComplexListNode* newTest = Clone(test);
    123     PrintComplexList(test);
    124     PrintComplexList(newTest);
    125     
    126 }
  • 相关阅读:
    The AndroidManifest.xml File
    handlebars简单用法
    高性能跨语言模板引擎Crox
    C++17 新特性
    C++ 14新特性
    [lua]笔记
    [lua]笔记
    delphi关键字
    delphi 基础
    TCP/UDP
  • 原文地址:https://www.cnblogs.com/Juntaran/p/5825983.html
Copyright © 2011-2022 走看看