链表找环

1、先判断是否有环

**思路:**用快慢两个指针分别从链表头开始,慢指针 -> next,快指针 -> next -> next,这样如果有环那快指针务必会跑到慢指针后面,随即两者之间的距离一次会缩小一步,最终相遇。若是未相遇且快指针的 next 为 null,则说明链表无环。

2、若是有环怎么找到环入口

链表中有闭环即快慢两指针相遇了
在这里插入图片描述
当两指针在 P 点相遇,我们可列出如下等式:

2(L+x) = L+x+n*H        (n >= 1) // n 为快指针在闭环上的圈数
=> 2L+2x = L+x+n*H      (n >= 1)
=> L = n*H-x            (n >= 1)
=> L = (n-1)*H+(H-x)   (n >= 1)

思路: 当 l1 与 l2 相遇时,再来一个 l3 指针从链表头开始,而 l1 继续走,l2 就可以终结其使命没必要继续走了。此时 l1 和 l3 指针都是指向其 next。当 l3 指针到达环入口时,l1 也必然到达了环入口,即 l1 和 l3 指针会在环入口相遇,从而可求得入口位置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用C++链表实现约瑟夫的示例代码: ```c++ #include <iostream> using namespace std; // 定义节点结构体 struct Node { int num; // 节点编号 Node *next; // 指向下一个节点的指针 }; // 创建链表 Node* createList(int n) { Node *head = new Node(); // 创建头节点 head->num = 1; head->next = NULL; Node *cur = head; for (int i = 2; i <= n; i++) { Node *newNode = new Node(); newNode->num = i; newNode->next = NULL; cur->next = newNode; cur = newNode; } cur->next = head; // 链接成链表 return head; } // 删除第m个节点 void deleteNode(Node *&head, int m) { Node *cur = head; Node *prev = NULL; // 到第m个节点和它前一个节点 while (cur->num != m) { prev = cur; cur = cur->next; } // 删除第m个节点 if (prev == NULL) { // 删除头节点 head = cur->next; } else { prev->next = cur->next; } delete cur; } // 约瑟夫 void josephus(int n, int m) { Node *head = createList(n); Node *cur = head; while (cur->next != cur) { // 当只剩下一个节点时退出循 // 到第m个节点 for (int i = 1; i < m; i++) { cur = cur->next; } // 删除第m个节点 int num = cur->num; deleteNode(head, num); cur = cur->next; // 继续从下一个节点开始 } // 输出最后剩下的节点编号 cout << "Last node: " << cur->num << endl; // 释放链表内存 delete cur; } int main() { int n, m; cout << "Enter n and m: "; cin >> n >> m; josephus(n, m); return 0; } ``` 该实现方式中,首先创建一个包含n个节点的链表,然后从头节点开始,每次到第m个节点并删除它,直到链表只剩下一个节点为止。最后输出剩下的节点编号。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值