这个问题是在我写Leetcode-141突然萌生出的小问号:
判断一个链表有没有环,现在能看到的做法一般有两种:一个是快慢指针,另一个是每遇到一个Node就把他的地址存进set中,如果find(a)!=s.end();
就表示出现了环。我们在新建set一般是这样写:set<LinkList*> s;
代表容器里存放的是地址。那么,我能不能往里面直接存Node呢?
应该是可以的,但是由于插入的类型是自定义的,非基本类型。而set/map这类容器是自动排序的,基本类型有默认的排序规则,但是自定义的没有,因此我们需要重载<运算符,相当于给自定义类型一个排序准则。
#include <iostream>
#include <set>
using namespace std;
typedef struct Node{
int val;
struct Node *next;
} LinkNode, *LinkList;
bool operator<(const LinkNode &a,const LinkNode &b){
return a.next < b.next;
}
int main(){
set<LinkNode> s;
LinkNode a,b,c;
a.val = 1;
b.val = 2;
c.val = 3;
a.next = &b;
b.next = &c;
c.next = NULL;
s.insert(a);
s.insert(b);
s.insert(c);
for (set<LinkNode>::iterator iter = s.begin(); iter != s.end();++iter){
cout << iter->val<< endl;
}
}
输出结果是:3,1,2
因此我们知道链表结点已被放进set且完成了自动排序,顺序是c,a,b。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。