【数据结构】关于复杂链表的复制

前端之家收集整理的这篇文章主要介绍了【数据结构】关于复杂链表的复制前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

复杂链表与单链表


首先呢,得告诉大家【复杂链表】【普通链表】的一些区别

可是这个不怎么好描述

不过呢,我请来了四个小学生】,来帮助大家理解



小时候的小A、小B、小C和小D

我们有四个同学 A、B、C、D

他们【高高兴兴】的排起了队

他们依次站着,无所他想,每个人只记住后面那个人,那么队伍就不会分散




小A、小B、小C和小D的成长

原本安安分分的A、B、C和D都长大了

他们之间有的迸发出了【爱情的火花

彼此之间会不会闹出矛盾???

【友谊的小船会不会说翻就翻??





在小A、小B、小C和小D的成长过程中

他们发现了爱情这个东西

小A:喜欢上了小C

小C:却喜欢小B

小B:表示【无可奈何】,我不想趟这趟浑水(怕小A报复)

小D:作为一只【单身狗】,我表示爱自己就好


现在,问题来了,请读者解答

1、上面四个好朋友中出现了【几角恋】

2、B为什么拒绝了C


好了,是不是很混乱呢,甚至有点晕乎

那么这就对了,这就是复杂链表


复杂链表的定义

在链表的结构体中,除了有一个指向【下个节点(后面那个人)的【指针

还有一个指向【链表自身【任意节点(或者NULL)】指针

那么这个链表就叫【复杂链表】


复杂链表的处理


复杂链表的构造(完整版代码在最后)

结构体:

  1. typedef struct DNode
  2. {
  3. int data;
  4. struct DNode* next;
  5. struct DNode* random;
  6. }DNode,*PDNode;

申请一个节点:

  1. PDNode BuyNewNode(int data)
  2. {
  3. PDNode NewNode = (PDNode)malloc(sizeof(DNode));
  4. if (NewNode == NULL)
  5. {
  6. return NULL;
  7. }
  8. NewNode->data = data;
  9. NewNode->next = NULL;
  10. NewNode->random = NULL;
  11. return NewNode;
  12. }

构建一个如题所示的复杂链表:

  1. PDNode MakeDiffList()
  2. {
  3. PDNode pHead = NULL;
  4. PDNode CurNode = NULL;
  5. PDNode NewNode = BuyNewNode(1);
  6. PDNode Node1,Node2,Node3,Node4 = NULL;//把四个节点都保存起来,好表示他们【长大后】的“暗恋”关系
  7. pHead = NewNode;
  8. CurNode = pHead;
  9. Node1 = CurNode;
  10.  
  11. NewNode = BuyNewNode(2);//NULL
  12. CurNode->next = NewNode;
  13. CurNode = CurNode->next;
  14. Node2 = CurNode;
  15.  
  16. NewNode = BuyNewNode(3);//2
  17. CurNode->next = NewNode;
  18. CurNode = CurNode->next;
  19. Node3 = CurNode;
  20.  
  21. NewNode = BuyNewNode(4);//自己
  22. CurNode->next = NewNode;
  23. CurNode = CurNode->next;
  24. Node4 = CurNode;
  25.  
  26. Node1->random = Node3;//小A 暗恋 小C
  27. Node2->random = NULL;//小B 谁都不恋
  28. Node3->random = Node2;//小C 暗恋 小B
  29. Node4->random = Node4;//小D 爱 自己
  30. return pHead;
  31. }


这样我们的复杂链表就够造好啦~~~



复杂链表的复制

(1)首先,是原来的链表



(2)然后我们还是首先复制每一个结点N为N*,并且让N*在对应的N后面,即为



注意:复制的过程中,love指针不能直接复制

比如 【A‘指向的是 【C 而不是 【C'

我们应当指向 【A->love->next】 通过C的下一个来找到 【C'】


(3)最后,将产生的新的复杂链表删除~大工搞成


复制复杂链表的代码

  1. PDNode CopyDiffList(PDNode*pHead)
  2. {
  3. PDNode CurNode = *pHead;
  4. PDNode NewHead = NULL;
  5. PDNode NewNode = NULL;
  6. if (pHead == NULL)
  7. {
  8. return NULL;
  9. }
  10. /**************首次复制并连接*********************/
  11. while (CurNode!=NULL)
  12. {
  13. //NewNode = BuyNewNode(CurNode->data*11);//测试中用11 倍的数据,方便调试
  14. NewNode = BuyNewNode(CurNode->data);
  15. NewNode->next = CurNode->next;
  16. NewNode->random = CurNode->random;
  17. CurNode->next = NewNode;
  18.  
  19. CurNode = NewNode->next;
  20. }
  21. /*************************************************/
  22.  
  23. /**************进行random的移动*******************/
  24. CurNode = *pHead;
  25. while (CurNode!= NULL)
  26. {
  27. if (CurNode->random != NULL)
  28. CurNode->next->random = CurNode->random->next;
  29. CurNode = CurNode->next->next;
  30. }
  31. /*************************************************/
  32.  
  33. /****************删除原来的元素*******************/
  34. CurNode = *pHead;
  35. NewHead = (*pHead)->next;
  36. NewNode = (*pHead)->next;
  37. while (CurNode->next->next!= NULL)
  38. {
  39. CurNode->next = NewNode->next;
  40. NewNode->next = NewNode->next->next;
  41.  
  42. CurNode = CurNode->next;
  43. NewNode = NewNode->next;
  44.  
  45. }
  46. NewNode->next = NULL;
  47. CurNode->next = NULL;
  48. /*************************************************/
  49.  
  50. return NewHead;
  51.  
  52. }

完整版代码

  1. //结构体
  2. typedef struct DNode
  3. {
  4. int data;
  5. struct DNode* next;
  6. struct DNode* random;
  7. }DNode,*PDNode;
  8.  
  9.  
  10. //生成一个新节点并返回
  11. PDNode BuyNewNode(int data)
  12. {
  13. PDNode NewNode = (PDNode)malloc(sizeof(DNode));
  14. if (NewNode == NULL)
  15. {
  16. return NULL;
  17. }
  18. NewNode->data = data;
  19. NewNode->next = NULL;
  20. NewNode->random = NULL;
  21. return NewNode;
  22. }
  23.  
  24. //构造复杂链表
  25. PDNode MakeDiffList()
  26. {
  27. PDNode pHead = NULL;
  28. PDNode CurNode = NULL;
  29. PDNode NewNode = BuyNewNode(1);
  30. PDNode Node1,Node4 = NULL;
  31. pHead = NewNode;
  32. CurNode = pHead;
  33. Node1 = CurNode;
  34.  
  35. NewNode = BuyNewNode(2);//NULL
  36. CurNode->next = NewNode;
  37. CurNode = CurNode->next;
  38. Node2 = CurNode;
  39.  
  40. NewNode = BuyNewNode(3);//2
  41. CurNode->next = NewNode;
  42. CurNode = CurNode->next;
  43. Node3 = CurNode;
  44.  
  45. NewNode = BuyNewNode(4);//自己
  46. CurNode->next = NewNode;
  47. //CurNode->random = CurNode;
  48. CurNode = CurNode->next;
  49. Node4 = CurNode;
  50.  
  51. Node1->random = Node3;
  52. Node2->random = NULL;
  53. Node3->random = Node2;
  54. Node4->random = Node4;
  55. return pHead;
  56. }
  57.  
  58. //复制复杂链表
  59. PDNode CopyDiffList(PDNode*pHead)
  60. {
  61. PDNode CurNode = *pHead;
  62. PDNode NewHead = NULL;
  63. PDNode NewNode = NULL;
  64. if (pHead == NULL)
  65. {
  66. return NULL;
  67. }
  68. /*****************首次复制并连接******************/
  69. while (CurNode!=NULL)
  70. {
  71. //NewNode = BuyNewNode(CurNode->data*11);//测试中用11 倍的数据,方便调试
  72. NewNode = BuyNewNode(CurNode->data);
  73. NewNode->next = CurNode->next;
  74. NewNode->random = CurNode->random;
  75. CurNode->next = NewNode;
  76.  
  77. CurNode = NewNode->next;
  78. }
  79. /*************************************************/
  80.  
  81. /**************进行random的移动*******************/
  82. CurNode = *pHead;
  83. while (CurNode!= NULL)
  84. {
  85. if (CurNode->random != NULL)
  86. CurNode->next->random = CurNode->random->next;
  87. CurNode = CurNode->next->next;
  88. }
  89. /*************************************************/
  90.  
  91. /****************删除原来的元素*******************/
  92. CurNode = *pHead;
  93. NewHead = (*pHead)->next;
  94. NewNode = (*pHead)->next;
  95. while (CurNode->next->next!= NULL)
  96. {
  97. CurNode->next = NewNode->next;
  98. NewNode->next = NewNode->next->next;
  99.  
  100. CurNode = CurNode->next;
  101. NewNode = NewNode->next;
  102.  
  103. }
  104. NewNode->next = NULL;
  105. CurNode->next = NULL;
  106. /*************************************************/
  107.  
  108. return NewHead;
  109.  
  110. }
  111.  
  112. //进行测试
  113. void FunTest()
  114. {
  115. PDNode pHead = NULL;
  116. PDNode pNewHead = NULL;
  117. pHead = MakeDiffList();
  118. pNewHead = CopyDiffList(&pHead);
  119. return;
  120. }
  121.  
  122. //主函数
  123. int main()
  124. {
  125. FunTest();
  126. return 0;
  127. }


皓皓有话说:


问:如何在众多课程的压力下继续看书呢?

Linux、C++primer

还有杨老师给我提示的如何预习Java(异常、继承、正则表达式等....)


挤一挤时间总会有的,下课时间十分钟的【休闲时光也要搭进去喽~

猜你在找的数据结构相关文章