【小浩算法cpp题解】判断环形链表

前言

前几天我写的代码,都是把所有的内容写在main函数里,没有体现CPP面向对象的特性,我感觉很不好,所以接下来我的代码都会设计类,把不同的功能封装在类的成员函数里面。

我的思路

思路一 (哈希表记录链表的访问):

其实我最开始的思路就是设置一个visit数组,大小为100,但是这里需要链表里面存储的data是不超过99的,这样我就能通过visit[Lnode->data]O(1)的时间复杂度里面快速判断这个数组有没有被访问过。如果遍历到一个被访问过的结点,那就说明这个链表有环

思路二 (双指针,快指针在前,慢指针在后):

这个思路最开始我没想到,参考了教程。其实原理就在于:

设想有两个人在操场上面跑步,一个人跑的比另外一个人快,那么最后快的肯定能追上慢的,这个时候快的已经比慢的领先一圈了。

我们考虑用双指针来实现,一个指针一步一步的走,一个指针两步两步的走。最后如果这两个指针能重合,那么就说明有环。
值得注意的是,这里的判断条件稍微有点复杂,null->next,cpp是会报错的

我的代码

#include<iostream>
#include <unordered_map>
using namespace std;

typedef struct Lnode {
   
   
	int data;
	struct Lnode* next;
	Lnode(int val) :
		data(val), next(NULL) {
   
   
	}
};

class LinkedList {
   
   
private:
	Lnode* head;
	Lnode* rear;
	int node_num;

public:
	LinkedList() : head(nullptr),rear(head) 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值