剑指offer之找到链表里面包含环的入口节点

举报
chenyu 发表于 2021/07/27 00:36:40 2021/07/27
【摘要】 1 问题 剑指offer之找到链表里面包含环的入口节点,比如 // node7<-node6 <-node5 // | | //head->node1->node2->node3->node4 环的入口节点是node2             2&n...

1 问题

剑指offer之找到链表里面包含环的入口节点,比如


  
  1. // node7<-node6 <-node5
  2. // | |
  3. //head->node1->node2->node3->node4

环的入口节点是node2

 

 

 

 

 

 

2 代码实现


  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define true 1
  4. #define false 0
  5. typedef struct node
  6. {
  7. int value;
  8. struct node *next;
  9. } Node;
  10. /**
  11. *得到环的第一个公共节点
  12. */
  13. Node *getCommonNode(Node *head)
  14. {
  15. if (head == NULL)
  16. {
  17. return NULL;
  18. }
  19. Node *first = NULL;
  20. Node *second = NULL;
  21. first = head;
  22. second = head;
  23. int isCircle = false;
  24. //判断是否有环
  25. while (second != NULL && (second->next) != NULL && (second->next->next != NULL))
  26. {
  27. first = first->next;
  28. second = second->next->next;
  29. if (first == second)
  30. {
  31. isCircle = true;
  32. break;
  33. }
  34. }
  35. if (isCircle == false)
  36. {
  37. printf("the list do not circle\n");
  38. return NULL;
  39. }
  40. //判断环的大小,这个时候肯定是进到环里面去了
  41. int len = 0;
  42. first = first->next;
  43. ++len;
  44. while (first != second)
  45. {
  46. len++;
  47. first = first->next;
  48. }
  49. //求出入口节点
  50. Node *start = head;
  51. Node *end = head;
  52. while (len-- > 0)
  53. {
  54. end = end->next;
  55. }
  56. while (start != end)
  57. {
  58. start = start->next;
  59. end = end->next;
  60. }
  61. return start;
  62. }
  63. int main()
  64. {
  65. Node *head = NULL;
  66. Node *node1 = NULL;
  67. Node *node2 = NULL;
  68. Node *node3 = NULL;
  69. Node *node4 = NULL;
  70. Node *node5 = NULL;
  71. Node *node6 = NULL;
  72. Node *node7 = NULL;
  73. head = (Node *)malloc(sizeof(Node));
  74. node1 = (Node *)malloc(sizeof(Node));
  75. node2 = (Node *)malloc(sizeof(Node));
  76. node3 = (Node *)malloc(sizeof(Node));
  77. node4 = (Node *)malloc(sizeof(Node));
  78. node5 = (Node *)malloc(sizeof(Node));
  79. node6 = (Node *)malloc(sizeof(Node));
  80. node7 = (Node *)malloc(sizeof(Node));
  81. if (head == NULL || node1 == NULL || node2 == NULL || node3 == NULL
  82. || node4 == NULL || node5 == NULL || node6 == NULL || node7 == NULL)
  83. {
  84. printf("malloc fail\n");
  85. return false;
  86. }
  87. // node7<-node6 <-node5
  88. // | |
  89. //head->node1->node2->node3->node4
  90. head->value = 0;
  91. head->next = node1;
  92. node1->value = 1;
  93. node1->next = node2;
  94. node2->value = 2;
  95. node2->next = node3;
  96. node3->value = 3;
  97. node3->next = node4;
  98. node4->value = 4;
  99. node4->next = node5;
  100. node5->value = 5;
  101. node5->next = node6;
  102. node6->value = 6;
  103. node6->next = node7;
  104. node7->value = 7;
  105. node7->next = node2;
  106. Node *result = getCommonNode(head);
  107. if (result != NULL)
  108. {
  109. printf("the first common value is %d\n", result->value);
  110. }
  111. else
  112. {
  113. printf("list do not have circle\n");
  114. }
  115. return true;
  116. }

 

 

 

 

 

 

3 运行结果

the first common value is 2
 

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/88046277

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。