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

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

1 问题

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

    //             node7<-node6 <-node5
    //              |              |
    //head->node1->node2->node3->node4

环的入口节点是node2


2 代码实现

#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0 
typedef struct node
{
    int value;
    struct node *next;
} Node;
/**
 *得到环的第一个公共节点
 */
Node *getCommonNode(Node *head)
{
    if (head == NULL)
    {
        return NULL;
    }
    Node *first = NULL;
    Node *second = NULL;
    first = head;
    second = head;
  int isCircle = false;
  //判断是否有环
    while (second != NULL && (second->next) != NULL && (second->next->next != NULL))
    {
        first = first->next;
        second = second->next->next;
        if (first == second)
        {
            isCircle = true;
      break;
        }
    }
  if (isCircle == false)
  {
    printf("the list do not circle\n");
    return NULL;  
  }
  //判断环的大小,这个时候肯定是进到环里面去了
  int len = 0;
  first = first->next;
  ++len;
  while (first != second)
  {
    len++;
    first = first->next;
  }
  //求出入口节点
  Node *start = head;
  Node *end = head;
  while (len-- > 0)
  {
    end = end->next;
  }
  while (start != end)
  {
    start = start->next;
    end = end->next;
  }
  return start;
}
int main()
{
    Node *head = NULL;
    Node *node1 = NULL;
    Node *node2 = NULL;
    Node *node3 = NULL;
    Node *node4 = NULL;
    Node *node5 = NULL;
    Node *node6 = NULL;
    Node *node7 = NULL;
    head = (Node *)malloc(sizeof(Node));
    node1 = (Node *)malloc(sizeof(Node));
    node2 = (Node *)malloc(sizeof(Node));
    node3 = (Node *)malloc(sizeof(Node));
    node4 = (Node *)malloc(sizeof(Node));
    node5 = (Node *)malloc(sizeof(Node));
    node6 = (Node *)malloc(sizeof(Node));
    node7 = (Node *)malloc(sizeof(Node));
    if (head == NULL || node1 == NULL || node2 == NULL || node3 == NULL
        || node4 == NULL || node5 == NULL || node6 == NULL || node7 == NULL)
    {
        printf("malloc fail\n");
        return false;
    }
  //             node7<-node6 <-node5
    //              |              |
    //head->node1->node2->node3->node4
    head->value = 0;
    head->next = node1;
    node1->value = 1;
    node1->next = node2;
    node2->value = 2;
    node2->next = node3;
    node3->value = 3;
    node3->next = node4;
    node4->value = 4;
    node4->next = node5;
    node5->value = 5;
    node5->next = node6;
    node6->value = 6;
    node6->next = node7;
    node7->value = 7;
    node7->next = node2;
    Node *result = getCommonNode(head);
    if (result != NULL)
    {
        printf("the first common value is %d\n", result->value);
    }
    else
    {
        printf("list do not have circle\n");
    }
    return true;
}

3 运行结果

the first common value is 2

相关文章
|
3月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
31 0
LeetCode第二十四题(两两交换链表中的节点)
|
3月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
48 0
Leetcode第十九题(删除链表的倒数第N个节点)
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
57 0
|
5月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
04_两两交换链表中的节点
04_两两交换链表中的节点
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
61 5
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
47 4
|
6月前
|
安全 云计算
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
云计算自旋锁问题之在线程安全地删除链表节点时,需要频繁加锁会影响性能如何解决
58 2
|
7月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表

热门文章

最新文章