【数据结构】环状链表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;
}

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值