• 剑指Offer——复杂链表的复制


    题目描述:

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


    分析:

     复制链表的复制分为3个步骤:

    1. 复制链表的每个结点到它们的结点的后面,如A->B->C->D变成A->A->B->B->C->C->D->D。
    2. 将复制出来的链表的每个结点的random指针指向原链表的每个结点的random指针指向的下一个位置。
    3. 拆分链表,成为两个链表。


    代码:

     1 /*
     2 struct RandomListNode {
     3     int label;
     4     struct RandomListNode *next, *random;
     5     RandomListNode(int x) :
     6             label(x), next(NULL), random(NULL) {
     7     }
     8 };
     9 */
    10 class Solution {
    11 public:
    12     RandomListNode* Clone(RandomListNode* pHead) {
    13         if(pHead == NULL) return NULL;
    14         RandomListNode* p = pHead;
    15         while(p) {  // 复制链表的每个结点接在相同结点的后面,如A->B->C->D变成A->A->B->B->C->C->D->D
    16             RandomListNode* pClone = new RandomListNode(p->label);
    17             pClone->next = p->next;
    18             p->next = pClone;
    19             p = pClone->next;
    20         }
    21         p = pHead;
    22         RandomListNode* pClone = pHead->next;
    23         while(p) {  // 使复制出来的结点的random指针,指向相应的位置
    24             if(p->random) pClone->random = p->random->next;
    25             p = pClone->next;
    26             if(p) pClone = p->next;
    27         }
    28         RandomListNode* head = pHead->next;
    29         p = pHead;
    30         pClone = head;
    31         while(p) {  // 拆分链表,成为一个新的链表,完成链表的复制
    32             p->next = pClone->next;
    33             p = pClone->next;
    34             if(p) {
    35                 pClone->next = p->next;
    36                 pClone = p->next;
    37             }
    38         }
    39         return head;
    40     }
    41 };
  • 相关阅读:
    java.lang.Class
    公司面试题目之取出数据库中重复的记录
    常用的linux基础命令
    算法练习4冒泡排序java版
    算法练习1桶排序java版
    算法练习2斐波那契数列java版
    算法练习3水仙花数java版
    mysql查询语句复习小结
    linux设置开机自动进入命令模式
    JSP九大内置对象和四个作用域
  • 原文地址:https://www.cnblogs.com/jacen789/p/7747642.html
Copyright © 2020-2023  润新知