剑指Offer24 复杂链表的复制

  1 /*************************************************************************
  2     > File Name: 24_ComplexListClone.cpp
  3     > Author: Juntaran
  4     > Mail: [email protected]
  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\n", head->val, head->rand->val);
 52         else
 53             printf("%d\n", head->val);
 54         head = head->next;
 55     }
 56     printf("\n");
 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 }
时间: 2024-08-05 11:17:59

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

剑指offer 复杂链表的复制

题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:要进行深拷贝,需要每次都new一个节点出来,利用unordered_map, 2.3 138. Copy List with Random Pointer https://leetcode.com/problems/copy-list-with-random-poi

剑指Offer--026-复杂链表的复制

链接 牛客OJ:复杂链表的复制 九度OJ:http://ac.jobdu.com/problem.php?pid=1524 GitHub代码: 026-复杂链表的复制 CSDN题解:剑指Offer–026-复杂链表的复制 牛客OJ 九度OJ CSDN题解 GitHub代码 复杂链表的复制 1524-复杂链表的复制 剑指Offer–026-复杂链表的复制 026-复杂链表的复制 题意 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)

25、剑指offer--复杂链表的复制

题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:直接把复制的node放在原node的后面,这样结构变为: 上面为第一次遍历,第二次遍历时把红色的新node的random域赋值,规则是: newNode->ranodm = oldNode->random->next; 然后第三次遍历把上面的链表拆分为两个即可

剑指offer之链表

//剑指offer 之 链表 //面试题6 从尾到头打印链表 /***************************************************************************************** 问题描述: 输入一个链表的头节点,从尾到头反过来打印出每个节点的值 链表节点定义如下: struct ListNode{ int m_nValue; ListNode* m_pNext; }; *******************************

【剑指offer】链表倒数第k个节点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC. 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的

剑指offer (5) 链表插入删除

我们在操作链表的时候,必须注意以下事项: 1. 链表指针为NULL的情况 2. 插入删除涉及到 链表第一个节点时,需要修改 链表的第一个节点: a. 因为 c语言都是传值的,如果需要修改一个变量,就必须通过 指向该变量的指针(即该变量的地址) 例如:例如 修改 int a,则输入参数必须是 int* a, 修改a 则是: *a = b; (b为int) 我们需要修改一个指针时,就必须通过 该指针的地址,也就是 指向该指针的指针,即二级指针 例如  修改 int* a, 则输入参数必须是 int*

剑指offer-18-2. 删除链表中重复的结点

剑指offer-18-2. 删除链表中重复的结点 链表 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: 采用递归的方法查找从头节点开始重复的节点 如果没有重复节点,pHead.next指向deleteDuplication(pHead.next)返回的pHead.next本身 如果有重复节点则pHead.next指向pHead

剑指offer-打印链表倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点. 看到这个题目,我们很容易想到一种做法,遍历两次链表,一次得到链表长度,另外一次得到倒数第k个结点. 不过要注意的是边界值的测试 链表为空 k大于链表长度 于是我的做法如下: public static ListNode FindKthToTail(ListNode head,int k) { if(head==null) { return null; } ListNode prehead=new ListNode(0); prehead.next=he

剑指Offer--037-两个链表的第一个公共结点

链接 牛客OJ:两个链表的第一个公共结点 九度OJ:http://ac.jobdu.com/problem.php?pid=1505 GitHub代码: 037-两个链表的第一个公共结点 CSDN题解:剑指Offer–037-两个链表的第一个公共结点 牛客OJ 九度OJ CSDN题解 GitHub代码 037-两个链表的第一个公共结点 1505-两个链表的第一个公共结点 剑指Offer–037-两个链表的第一个公共结点 037-两个链表的第一个公共结点 题意 题目描述 输入两个链表,找出它们的第