這個問題是在我寫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