/*************************************************************************
> File Name: 24_ComplexListClone.cpp
> Author: Juntaran
> Mail: JuntaranMail@gmail.com
> Created Time: 2016年08月31日 星期三 14时24分35秒
************************************************************************/ #include <stdio.h>
#include <malloc.h> // 链表结构体
struct ComplexListNode
{
int val;
ComplexListNode* next;
ComplexListNode* rand;
}; // 构造链表
ComplexListNode* createList()
{
ComplexListNode* A = new ComplexListNode();
ComplexListNode* B = new ComplexListNode();
ComplexListNode* C = new ComplexListNode();
ComplexListNode* D = new ComplexListNode();
ComplexListNode* E = new ComplexListNode();
A->val = ;
A->next = B;
A->rand = C;
B->val = ;
B->next = C;
B->rand = E;
C->val = ;
C->next = D;
C->rand = NULL;
D->val = ;
D->next = E;
D->rand = B;
E->val = ;
E->next = NULL;
E->rand = NULL; return A;
} void* PrintComplexList(ComplexListNode* head)
{
while (head)
{
if (head->rand != NULL)
printf("%d rand=%d\n", head->val, head->rand->val);
else
printf("%d\n", head->val);
head = head->next;
}
printf("\n");
} // 复制链表,复制的接在原位置后面
void CloneNodes(ComplexListNode* head)
{
ComplexListNode* node = head;
while (node != NULL)
{
ComplexListNode* newNode = new ComplexListNode();
newNode->val = node->val;
newNode->next = node->next;
newNode->rand = NULL;
node->next = newNode;
node = newNode->next;
}
} // 补充复制的链表的rand指针
void AddRand(ComplexListNode* head)
{
ComplexListNode* node = head;
while (node != NULL)
{
ComplexListNode* newNode = node->next;
if (node->rand != NULL)
newNode->rand = node->rand->next;
node = newNode->next;
}
} // 拆分链表
ComplexListNode* SplitList(ComplexListNode* head)
{
ComplexListNode* node = head;
ComplexListNode* newHead = NULL;
ComplexListNode* newNode = NULL; if (node != NULL)
{
newHead = newNode = node->next;
node->next = newNode->next;
node = node->next;
}
while (node != NULL)
{
newNode->next = node->next;
newNode = newNode->next;
node->next = newNode->next;
node = node->next;
}
return newHead;
} ComplexListNode* Clone(ComplexListNode* head)
{
CloneNodes(head);
AddRand(head);
return SplitList(head);
} int main()
{
ComplexListNode* test = createList();
PrintComplexList(test); ComplexListNode* newTest = Clone(test);
PrintComplexList(test);
PrintComplexList(newTest); }

剑指Offer24 复杂链表的复制的更多相关文章

  1. 剑指offer-复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  2. 剑指Offer——复杂链表的复制

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用, ...

  3. 剑指offer-复杂链表的复制-链表-python

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  4. 剑指offer 复杂链表的复制 (有向图的复制)

    时间复杂度O(3N) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...

  5. 剑指Offer-25.复杂链表的复制(C++/Java)

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

  6. 用js刷剑指offer(复杂链表的复制)

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  7. 剑指offer26 复杂链表的复制

    /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : ...

  8. leetcode 203. Remove Linked List Elements 、83. Remove Duplicates from Sorted List 、82. Remove Duplicates from Sorted List II(剑指offer57 删除链表中重复的结点)

    203题是在链表中删除一个固定的值,83题是在链表中删除重复的数值,但要保留一个:82也是删除重复的数值,但重复的都删除,不保留. 比如[1.2.2.3],83题要求的结果是[1.2.3],82题要求 ...

  9. 《剑指offer》 链表中倒数第k个节点

    本题来自<剑指offer> 链表中倒数第k个节点 题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 倒数第k个节点,而且只能访问一遍链表,定义两个节点,两者之间相差k个距离,遍历 ...

随机推荐

  1. Objc基础学习记录5

    NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendi ...

  2. asp获取勾选checkbox的值

    Dim str_select  str_select = CStr(request.Form("c_name")) c_name是checkbox的name

  3. git/github 使用

    原文:http://www.cnblogs.com/fnng/archive/2011/08/25/2153807.html git/github学习笔记 Posted on 2011-08-25 2 ...

  4. Server-U_详细配置

    1.首先绿化 Server-U,运行 2.打开Server-U自动弹出如下图:如果不自动弹出,那点击界面上的 新建域  ------ 先有域再有用户,用户在域里面 4. 输入“名称”和“说明”,其中“ ...

  5. C# try catch finally 执行

    try { //dosomething eg: int a = 1; int b = 2; int c = a + b; if(c>2) { return; } } catch(Exceptio ...

  6. javaScript-原型、继承-02

    原型链 首先回顾下实列.构造函数.原型对象之间的关系: 实列都包含指向原型对象的一个指针(_proto_): 构造函数都有prototype(原型属性)指向原型对象的指针: 原型是一个对象也存在一个内 ...

  7. perl学习笔记(2)

    1)记得刚开始写perl的时候,对于一个功能,总是拿目前能用的数据类型来解决问题,不想想有没有更好的,能用能解决问题就好,这就导致了后期,要在函数里面添加功能的时候,函数要添加很多参数,一个函数有7. ...

  8. DISCUZ X2更换域名注意事项

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. Codeforces Round #181 (Div. 2) A. Array 构造

    A. Array 题目连接: http://www.codeforces.com/contest/300/problem/A Description Vitaly has an array of n ...

  10. C#操作XML的完整例子——XmlDocument篇

    这是一个用c#控制台程序下,  用XmlDocument 进行XML操作的的例子,包含了查询.增加.修改.删除.保存的基本操作.较完整的描述了一个XML的整个操作流程.适合刚入门.net XML操作的 ...