alg-链表中有环
typedef struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
}ListNode;
class Solution {
public:
//链表中是否有环
bool hasCycle(ListNode* head) {
if(!head) {
return false;
}
ListNode* fast=head;
ListNode* slow=head;
while(fast&&fast->next) {
slow=slow->next;
fast=fast->next->next;
if(fast==slow) {
return true;
}
}
return false;
}
//链表中环的起始点
ListNode *beginCycle(ListNode* head) {
if(!head) return nullptr;
ListNode *fast = head;
ListNode *slow = head;
while(fast&& fast->next) {
fast = fast->next->next;
slow = slow->next;
if(fast == slow) {
//从相遇点和链表起始点同时循环两个指针,直到二者相遇,相遇点就是环起始点
ListNode *first = head;
while(first != slow) {
first = first->next;
slow = slow->next;
}
return first;
}
}
return NULL;
}
//链表中环的长度
int lengthCycle(ListNode* head) {
if(!head) {
return false;
}
ListNode* fast=head;
ListNode* slow=head;
while(fast&&fast->next) {
slow=slow->next;
fast=fast->next->next;
if(fast==slow) {
slow=slow->next;
int length=1;
while(slow!=fast) {
slow=slow->next;
length++;
}
return length;
}
}
return 0;
}
};
void TestListCycle() {
ListNode lp1(1);
ListNode lp2(2);
ListNode lp3(3);
ListNode lp4(4);
ListNode lp5(5);
ListNode lp6(6);
ListNode lp7(7);
ListNode lp8(8);
ListNode lp9(9);
lp1.next=&lp2;
lp2.next=&lp3;
lp3.next=&lp4;
lp4.next=&lp5;
lp5.next=&lp6;
lp6.next=&lp7;
lp7.next=&lp8;
lp8.next=&lp9;
lp9.next=&lp3;
ListNode* head=&lp1;
Solution s;
std::cout<<"hasCycle:"<<s.hasCycle(head)<<std::endl;
ListNode* lp=nullptr;
lp=s.beginCycle(head);
std::cout<<"detectCycle:"<<lp->val<<std::endl;
std::cout<<"lengthCycle:"<<s.lengthCycle(head)<<std::endl;
}
alg-链表中有环的更多相关文章
- 【C++】链表回环检测
//链表回环检测问题 #include<iostream> #include<cstdlib> using namespace std; ; struct node { int ...
- [PHP] 算法-请找出带环链表的环的入口结点的PHP实现
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...
- 《剑指offer》-链表找环入口
题目描述 一个链表中包含环,请找出该链表的环的入口结点. 初步想法是每个节点做几个标记,表示是否被访问过,那么遍历链表的时候就知道哪个被访问到了.但是不会实现. 另一个直觉是判断链表有环的算法中出现过 ...
- Linked List Cycle leetcode java (链表检测环)
题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without usin ...
- 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
package algorithms; /* 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. public class ListNode { int val; ListNo ...
- 转 java - 如何判断单链表有环
转自 https://blog.csdn.net/u010983881/article/details/78896293 1.穷举遍历 首先从头节点开始,依次遍历单链表的每一个节点.每遍历到一个新节点 ...
- select 函数实现 三种拓扑结构 n个客户端的异步通信 (完全图+线性链表+无环图)
一.这里只介绍简单的三个客户端异步通信(完全图拓扑结构) //建立管道 mkfifo open顺序: cl1 读 , cl2 cl3 向 cl1写 cl2 读 , cl1 cl3 向 cl2写 cl3 ...
- leetCodelinked-list-cycle-ii找到链表的环
题目 Given a linked list, return the node where the cycle begins. If there is no cycle, return null. N ...
- leetcode - 链表两两元素交换 + 判断链表有无环
链表两两元素交换 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你 ...
随机推荐
- 作为一位Vue工程师,这些开发技巧你都会吗?
路由参数解耦 一般在组件内使用路由参数,大多数人会这样做: export default { methods: { getParamsId() { return this.$route.params. ...
- dom4j解析xml格式文件实例
以下给4种常见的xml文件的解析方式的分析对比: DOM DOM4J JDOM SAX Dom解析 在内存中创建一个DOM树,该结构通常需要加载整个文档然后才能做工作.由于它是基于信息层次 ...
- 金三银四,还在为spring源码发愁吗?bean生命周期,看了这篇就够了
第一,这绝对是一个面试高频题. 比第一还重要的第二,这绝对是一个让人爱恨交加的面试题.为什么这么说?我觉得可以从三个方面来说: 先说会不会.看过源码的人,这个不难:没看过源码的人,无论是学.硬背.还是 ...
- ES6编译问题SyntaxError: Unexpected token import
遇到SyntaxError: Unexpected token import 如何解决 ??? 究其原因是node es6问题这还不够,因为我们没有去配置babel,所以我们需要在.babelrc去做 ...
- AdFind
C++实现(未开源),用于查询域内信息 http://www.joeware.net/freetools/tools/adfind/index.htm 常用命令如下: 列出域控制器名称: AdFind ...
- http服务部署
[root@xiaoyi ~]# vim /etc/ssh/sshd_config 17行 Port 22 49行 PermitRootLogin yes 观察IP地址与物理机属于同一个网段 打开Fi ...
- html5 window.postMessage 传递数据的使用
window.postMessage(图片介绍): 发送方(图片介绍): 接收方(图片介绍): 个人测试一(iframe): 发送方,地址为:http://localhost:63342/HelloH ...
- PyTorch专栏(二)
专栏目录: 第一章:PyTorch之简介与下载 PyTorch简介 PyTorch环境搭建 第二章:PyTorch之60min入门 PyTorch 入门 PyTorch 自动微分 PyTorch 神经 ...
- js事件的获取
获取元素样式属性 Method DES clientWidth 获取元素宽度 clientHeight 获取元素高度(内容+内边距) document.body.clientWidth 获取body宽 ...
- SQL实战(三)
一. 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_noy以及其对应的薪水涨幅growth,并按照growth进行升序CREATE TABLE `employees` (`emp_no` ...