【数据结构】环状链表OJ题

✨✨✨专栏:数据结构     

  🧑‍🎓个人主页SWsunlight

       

一、OJ 环形链表

 快慢指针即可解决问题:

2情况:

  1. 快指针走到结尾(不是环)
  2. 快指针和尾指针相遇(是环的)

竟然是2倍关系,那么入环以后,也就是快指针走一次,与慢指针的距离会缩减1.知道N=0,相遇

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
//快慢指针
bool hasCycle(struct ListNode *head) {
    ListNode* phead = head;
    ListNode* perv = head;
    //先判断perv是否为空,若是为空,则不会进继续计算,若是先判断perv下个节点,若是perv为NULL,就会导致对空指针进行解引用
    while(perv&&perv->next)
    {
        perv = perv->next->next;
        phead = phead->next;
        if(perv == phead)
        {
            return true;
        }
    }
    return false;
}

二、OJ  环形链表II

思路:

比1多了一个条件要返回入环时的节点,实现环形相遇可以直接CV过来,要解决的是怎么找到入环节点:看下面式子,(X-1)*N意思不就是相遇后,(一直转圈)会回到这个点;N-C 不就是相当于L么;此时可以让head开始遍历 从头开始走,慢指针让他从相遇点继续走,当到如环点时必相遇;

 typedef struct ListNode ListNode;
//快慢指针
struct ListNode *detectCycle(struct ListNode *head) {
      ListNode* phead = head;
    ListNode* perv = head;
    //先判断perv是否为空,若是为空,则不会进继续计算,若是先判断perv下个节点,若是perv为NULL,就会导致对空指针进行解引用
    while(perv&&perv->next)
    {
        perv = perv->next->next;
        phead = phead->next;
        if(phead == perv)
        {
            while(perv!=head)
            {
                perv = perv->next;
                head = head->next;
            }
            return head;
        }

    }

    return NULL;
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 07:52:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 07:52:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 07:52:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 07:52:06       20 阅读

热门阅读

  1. 02.01移除重复点

    2024-05-13 07:52:06       14 阅读
  2. 富格林:正规经验加持交易安全

    2024-05-13 07:52:06       8 阅读
  3. Lua 基础 01 入门

    2024-05-13 07:52:06       13 阅读
  4. Spring Boot应用部署 - JAR包部署瘦身

    2024-05-13 07:52:06       16 阅读
  5. [力扣题解]860. 柠檬水找零

    2024-05-13 07:52:06       15 阅读
  6. 数据结构(五)什么是算法

    2024-05-13 07:52:06       12 阅读