前言
前几天我写的代码,都是把所有的内容写在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)

最低0.47元/天 解锁文章
358

被折叠的 条评论
为什么被折叠?



