这个问题是在我写Leetcode-141忽然萌生出的小问号:
判断一个链表有没有环,如今能看到的作法通常有两种:一个是快慢指针,另外一个是每遇到一个Node就把他的地址存进set中,若是find(a)!=s.end();
就表示出现了环。咱们在新建set通常是这样写:set<LinkList*> s;
表明容器里存放的是地址。那么,我能不能往里面直接存Node呢?
应该是能够的,可是因为插入的类型是自定义的,非基本类型。而set/map这类容器是自动排序的,基本类型有默认的排序规则,可是自定义的没有,所以咱们须要重载<运算符,至关于给自定义类型一个排序准则。ios
#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。spa