精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

五個解決辦法教你C++中檢測鏈表中的循環

開發 后端
通過5個解決方案教你C++中檢測鏈表中的循環,快來看看,是否對你有幫助!

五個解決辦法教你C++中檢測鏈表中的循環

給定一個鏈表,檢查鏈表是否有循環。下圖顯示了帶有循環的鏈表。

五個解決辦法教你C++中檢測鏈表中的循環

 

以下是執行此操作的不同方法 

 

解決方案1:散列方法:

遍歷該列表,并將節點地址始終放在哈希表中。在任何時候,如果達到NULL,則返回false,如果當前節點的下一個指向Hash中先前存儲的任何節點,則返回true。

  1. #include <bits/stdc++.h> 
  2. using namespace std; 
  3. struct Node { 
  4.     int data; 
  5.     struct Node* next
  6. }; 
  7.   
  8. void push(struct Node** head_ref, int new_data) 
  9.     struct Node* new_node = new Node; 
  10.     new_node->data = new_data; 
  11.     new_node->next = (*head_ref); 
  12.     (*head_ref) = new_node; 
  13. bool detectLoop(struct Node* h) 
  14.     unordered_set<Node*> s; 
  15.     while (h != NULL) { 
  16.         if (s.find(h) != s.end()) 
  17.             return true
  18.         s.insert(h); 
  19.   
  20.         h = h->next
  21.     } 
  22.   
  23.     return false
  24. int main() 
  25.     struct Node* head = NULL
  26.   
  27.     push(&head, 20); 
  28.     push(&head, 4); 
  29.     push(&head, 15); 
  30.     push(&head, 10); 
  31.     head->next->next->next->next = head; 
  32.   
  33.     if (detectLoop(head)) 
  34.         cout << "Loop found"
  35.     else 
  36.         cout << "No Loop"
  37.   
  38.     return 0; 

復雜度分析:

時間復雜度: O(n)。
只需循環一次即可。

輔助空間: O(n)。
n是將值存儲在哈希圖中所需的空間。

解決方案2:通過修改鏈表數據結構,無需哈希圖即可解決此問題。
方法:此解決方案需要修改基本鏈表數據結構。

  • 每個節點都有一個訪問標志。
  • 遍歷鏈接列表并繼續標記訪問的節點。
  • 如果您再次看到一個訪問過的節點,那么就會有一個循環。該解決方案適用于O(n),但每個節點都需要其他信息。
  • 此解決方案的一種變體不需要修改基本數據結構,可以使用哈希來實現,只需將訪問的節點的地址存儲在哈希中,如果您看到哈希中已經存在的地址,則存在一個循環。

C++:

  1. #include <bits/stdc++.h> 
  2. using namespace std; 
  3. struct Node { 
  4.     int data; 
  5.     struct Node* next
  6.     int flag; 
  7. }; 
  8.   
  9. void push(struct Node** head_ref, int new_data) 
  10.     struct Node* new_node = new Node; 
  11.     new_node->data = new_data; 
  12.   
  13.     new_node->flag = 0; 
  14.     new_node->next = (*head_ref); 
  15.     (*head_ref) = new_node; 
  16. bool detectLoop(struct Node* h) 
  17.     while (h != NULL) { 
  18.         if (h->flag == 1) 
  19.             return true
  20.         h->flag = 1; 
  21.   
  22.         h = h->next
  23.     } 
  24.   
  25.     return false
  26. int main() 
  27.     struct Node* head = NULL
  28.   
  29.     push(&head, 20); 
  30.     push(&head, 4); 
  31.     push(&head, 15); 
  32.     push(&head, 10); 
  33.     head->next->next->next->next = head; 
  34.   
  35.     if (detectLoop(head)) 
  36.         cout << "Loop found"
  37.     else 
  38.         cout << "No Loop"
  39.   
  40.     return 0; 

復雜度分析:

時間復雜度: O(n)。
只需循環一次即可。

輔助空間: O(1)。
不需要額外的空間。

解決方案3:Floyd的循環查找算法
方法:這是最快的方法,下面進行了介紹:

  • 使用兩個指針遍歷鏈表。
  • 將一個指針(slow_p)移動一個,將另一個指針(fast_p)移動兩個。
  • 如果這些指針在同一節點相遇,則存在循環。如果指針不符合要求,則鏈接列表沒有循環。

Floyd的循環查找算法的實現:

  1. #include <bits/stdc++.h> 
  2. using namespace std; 
  3. class Node { 
  4. public
  5.     int data; 
  6.     Node* next
  7. }; 
  8.   
  9. void push(Node** head_ref, int new_data) 
  10.     Node* new_node = new Node(); 
  11.     new_node->data = new_data; 
  12.     new_node->next = (*head_ref); 
  13.     (*head_ref) = new_node; 
  14.   
  15. int detectLoop(Node* list) 
  16.     Node *slow_p = list, *fast_p = list; 
  17.   
  18.     while (slow_p && fast_p && fast_p->next) { 
  19.         slow_p = slow_p->next
  20.         fast_p = fast_p->next->next
  21.         if (slow_p == fast_p) { 
  22.             return 1; 
  23.         } 
  24.     } 
  25.     return 0; 
  26. int main() 
  27.     Node* head = NULL
  28.   
  29.     push(&head, 20); 
  30.     push(&head, 4); 
  31.     push(&head, 15); 
  32.     push(&head, 10); 
  33.     head->next->next->next->next = head; 
  34.     if (detectLoop(head)) 
  35.         cout << "Loop found"
  36.     else 
  37.         cout << "No Loop"
  38.     return 0; 

解決方案4:在不修改鏈接列表數據結構的情況下標記訪問的節點
在此方法中,將創建一個臨時節點。使遍歷的每個節點的下一個指針指向該臨時節點。這樣,我們將節點的下一個指針用作標志來指示該節點是否已遍歷。檢查每個節點以查看下一個節點是否指向臨時節點。在循環的第一個節點的情況下,第二次遍歷該條件將成立,因此我們發現該循環存在。如果遇到一個指向null的節點,則循環不存在。
下面是上述方法的實現:

  1. #include <bits/stdc++.h> 
  2. using namespace std; 
  3.   
  4. struct Node { 
  5.     int key
  6.     struct Node* next
  7. }; 
  8.   
  9. Node* newNode(int key
  10.     Node* temp = new Node; 
  11.     temp->key = key
  12.     temp->next = NULL
  13.     return temp
  14. void printList(Node* head) 
  15.     while (head != NULL) { 
  16.         cout << head->key << " "
  17.         head = head->next
  18.     } 
  19.     cout << endl; 
  20. bool detectLoop(Node* head) 
  21.     Node* temp = new Node; 
  22.     while (head != NULL) { 
  23.         if (head->next == NULL) { 
  24.             return false
  25.         } 
  26.         if (head->next == temp) { 
  27.             return true
  28.         } 
  29.         Node* nex = head->next
  30.         head->next = temp
  31.         head = nex; 
  32.     } 
  33.   
  34.     return false
  35. int main() 
  36.     Node* head = newNode(1); 
  37.     head->next = newNode(2); 
  38.     head->next->next = newNode(3); 
  39.     head->next->next->next = newNode(4); 
  40.     head->next->next->next->next = newNode(5); 
  41.     head->next->next->next->next->next = head->next->next
  42.   
  43.     bool found = detectLoop(head); 
  44.     if (found) 
  45.         cout << "Loop Found"
  46.     else 
  47.         cout << "No Loop"
  48.   
  49.     return 0; 

復雜度分析:

時間復雜度: O(n)。
只需循環一次即可。

輔助空間: O(1)。
不需要空間。

解決方案5:存放長度

在此方法中,將創建兩個指針,第一個(始終指向頭)和最后一個指針。每次最后一個指針移動時,我們都會計算第一個和最后一個之間的節點數,并檢查當前節點數是否大于先前的節點數,如果是,我們通過移動最后一個指針進行操作,否則就意味著我們已經到達循環的終點,因此我們相應地返回輸出。

  1. #include <bits/stdc++.h> 
  2. using namespace std; 
  3.   
  4. struct Node { 
  5.     int key
  6.     struct Node* next
  7. }; 
  8.   
  9. Node* newNode(int key
  10.     Node* temp = new Node; 
  11.     temp->key = key
  12.     temp->next = NULL
  13.     return temp
  14. void printList(Node* head) 
  15.     while (head != NULL) { 
  16.         cout << head->key << " "
  17.         head = head->next
  18.     } 
  19.     cout << endl; 
  20. int distance(Node* first, Node* last
  21.     int counter = 0; 
  22.   
  23.     Node* curr; 
  24.     curr = first
  25.   
  26.     while (curr != last) { 
  27.         counter += 1; 
  28.         curr = curr->next
  29.     } 
  30.   
  31.     return counter + 1; 
  32. bool detectLoop(Node* head) 
  33.     Node* temp = new Node; 
  34.   
  35.     Node *first, *last
  36.     first = head; 
  37.     last = head; 
  38.     int current_length = 0; 
  39.     int prev_length = -1; 
  40.   
  41.     while (current_length > prev_length && last != NULL) { 
  42.           prev_length = current_length; 
  43.         current_length = distance(firstlast); 
  44.         last = last->next
  45.     } 
  46.       
  47.     if (last == NULL) { 
  48.         return false
  49.     } 
  50.     else {  
  51.         return true
  52.     } 
  53. int main() 
  54.     Node* head = newNode(1); 
  55.     head->next = newNode(2); 
  56.     head->next->next = newNode(3); 
  57.     head->next->next->next = newNode(4); 
  58.     head->next->next->next->next = newNode(5); 
  59.     head->next->next->next->next->next = head->next->next
  60.   
  61.     bool found = detectLoop(head); 
  62.     if (found) 
  63.         cout << "Loop Found"
  64.     else 
  65.         cout << "No Loop Found"
  66.   
  67.     return 0; 

} 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2017-05-04 20:15:51

iOSNSTimer循環引用

2023-10-29 00:55:44

2012-03-14 10:58:27

Java

2021-10-31 20:24:24

C++for循環

2011-06-16 09:28:02

C++內存泄漏

2024-10-07 08:26:05

編程Python異常處理

2015-06-10 13:49:53

2023-09-27 23:24:50

C++鏈表

2023-08-28 10:54:09

容器Docker

2009-09-28 10:09:09

Linux內核Linux循環鏈表

2023-11-03 07:58:54

CORSSpring

2010-01-27 16:05:06

C++堆棧

2010-01-21 09:34:57

C++語法

2011-03-04 13:07:47

Filezilla

2009-06-03 16:41:21

Eclipse亂碼Eclipse

2011-07-27 19:05:35

2025-03-19 08:40:00

2009-05-31 09:07:35

Oracle鎖定

2011-01-19 17:54:48

2009-12-29 10:24:51

Linux內核循環鏈表
點贊
收藏

51CTO技術棧公眾號

日韩电影一区| 川上优av中文字幕一区二区| 久久精品盗摄| 爱福利视频一区| 亚洲熟女一区二区三区| 色是在线视频| 中文字幕在线观看不卡视频| 成人av免费电影| 国产一区免费看| 亚洲欧洲中文字幕| 亚洲欧美福利视频| 精品人妻一区二区乱码| 日韩精品三区| 一区二区不卡在线播放| 免费观看成人高| jlzzjlzzjlzz亚洲人| 久久伊人亚洲| 欧美激情视频三区| 卡通动漫亚洲综合| 精品一区二区三区在线| 欧美精品一区二区三区在线播放| 99视频在线免费| 91超碰在线免费| 亚洲欧洲成人自拍| 日本一区二区三区在线视频| 丰满少妇高潮在线观看| 久久国产福利国产秒拍| 日本久久久久久| www.youjizz.com亚洲| 久久免费精品视频在这里| 亚洲精品一区二区网址| 国产免费a级片| 天天综合91| 欧美午夜不卡在线观看免费| 乱妇乱女熟妇熟女网站| 青草av在线| 一区二区高清免费观看影视大全 | 精品国产一二三四区| 黄色在线免费网站| 国产精品区一区二区三区| 精品无人乱码一区二区三区的优势| 国产欧美久久久精品免费| 日本不卡的三区四区五区| 欧美亚洲另类激情另类| www.99re7.com| 国产综合自拍| 欧美理论电影在线观看| 国产一区二区视频在线观看免费| 欧美高清在线| 久久精品视频在线观看| 日本美女bbw| 懂色一区二区三区| 91啪亚洲精品| 蜜桃av色综合| 欧美精品久久久久久久久久丰满| 97aⅴ精品视频一二三区| 国产精品视频一区二区三区经| 一区二区三区亚洲视频| 毛片基地黄久久久久久天堂| 国产精品91视频| 人人妻人人爽人人澡人人精品 | 色啦啦av综合| 久久亚洲国产精品尤物| 欧美精品一级二级| √天堂资源在线| 日韩激情综合| 亚洲二区在线播放视频| 男人的天堂影院| 日韩高清影视在线观看| 亚洲天堂日韩电影| 国产白丝一区二区三区| 2023国产精品久久久精品双| 久久影院模特热| 久久久久久久蜜桃| 国产精品免费看| 国产精品久久久av| 一本一道人人妻人人妻αv | 成人午夜小视频| av一级黄色片| 91丨九色丨尤物| 亚洲国产午夜伦理片大全在线观看网站 | 日韩精品第二页| 日韩一区二区在线观看视频播放| 中文字幕乱码在线人视频| 国产亚洲精品美女久久| 国产亚洲欧美另类中文| 日韩成人短视频| 日韩亚洲国产欧美| 国产精品亚洲美女av网站| 国产模特av私拍大尺度| 97超碰欧美中文字幕| 日韩欧美亚洲精品| 里番在线播放| 在线日韩av片| 欧美一级大片免费看| 欧洲亚洲视频| 久久人人爽人人爽人人片亚洲| 久久免费少妇高潮99精品| 久久九九电影| caoporen国产精品| 福利在线视频导航| 亚洲国产精品久久一线不卡| 国产激情在线观看视频| 久久三级中文| 国产亚洲精品久久久优势| 欧美又粗又大又长| 日本不卡的三区四区五区| 国产一区免费在线观看| 黄色网址在线免费| 日韩欧美在线视频| 少妇伦子伦精品无吗| 日韩a一区二区| 91精品国产高清自在线 | 国产一区 二区 三区一级| 蜜桃视频在线观看91| 国产美女在线观看| 欧美亚洲国产一卡| 在线观看国产网站| 欧美三级乱码| 91精品久久久久久久久久另类| 天堂在线资源8| 一区二区在线电影| xxxx在线免费观看| re久久精品视频| 青青久久av北条麻妃海外网| 免费av一级片| 亚洲一区免费观看| 日本wwwxx| 91精品久久久久久久蜜月 | 年轻的保姆91精品| 日韩视频免费观看| 中文字幕人妻互换av久久| 91麻豆精品一区二区三区| 免费人成自慰网站| 91精品短视频| 欧美激情国产高清| 亚洲精品18p| 夜夜精品视频一区二区| 天美一区二区三区| 亚洲乱码精品| 91日本在线观看| 黄色网页在线免费看| 欧美日韩国产综合久久| 日本美女xxx| 视频一区视频二区中文| 欧洲视频一区二区三区| 另类专区亚洲| 国产亚洲视频中文字幕视频| 免费污污视频在线观看| 久久天天做天天爱综合色| 黄色动漫网站入口| 免费观看久久av| 人体精品一二三区| 91看片在线观看| 欧美日韩高清一区二区不卡| 色偷偷www8888| 中国精品18videos性欧美| 国产一区视频在线| 国产原创在线观看| 日韩精品专区在线| 国产网站在线看| 99久久精品情趣| 99蜜桃臀久久久欧美精品网站| 同性恋视频一区| 日韩美女视频免费在线观看| 黄色片在线播放| 欧美精品在线观看一区二区| 欧美黑人一级片| 99久久伊人网影院| 成人中文字幕av| 亚洲精品成人无限看| 国产不卡一区二区三区在线观看| 91九色在线播放| 亚洲香蕉av在线一区二区三区| 中文字幕乱码人妻无码久久| 自拍偷在线精品自拍偷无码专区| 久久久久久久久久久影视| 亚洲乱亚洲高清| 日韩色妇久久av| 久久久久九九精品影院| 97在线视频一区| yiren22亚洲综合伊人22| 欧美一区二区三区播放老司机| 精品无码人妻一区二区三区品| 99久久99久久免费精品蜜臀| 爱情岛论坛成人| 国产精品a久久久久| 日韩伦理一区二区三区av在线| 午夜精品久久久久久毛片| 欧美激情xxxx性bbbb| 欧美高清电影在线| 91精品国产麻豆| 日韩色图在线观看| 亚洲美女一区二区三区| 好吊日免费视频| 国模娜娜一区二区三区| 国产成人精品视频免费看| 国产精品福利在线观看播放| 好看的日韩精品视频在线| 黄色成人小视频| 91国在线精品国内播放 | 中文字幕一区二区5566日韩| 国产精品麻豆入口| 久久99久久久欧美国产| 欧美日韩性生活片| 亚洲字幕久久| 亚洲精品成人久久久998| 国产伦乱精品| 99re在线观看| 素人啪啪色综合| 26uuu另类亚洲欧美日本老年| 久久bbxx| 中文字幕亚洲无线码在线一区| 黄色片一区二区三区| 3751色影院一区二区三区| 黄色av一级片| 午夜免费久久看| 国精品无码一区二区三区| 日本一区二区不卡视频| 日本一级片在线播放| 国产白丝精品91爽爽久久 | 精品久久国产一区| 国产精品女主播视频| 涩涩涩在线视频| 色综合久久久久久中文网| 三区四区在线视频| 国产性猛交xxxx免费看久久| 天天av综合网| 亚洲国产97在线精品一区| 国产成人毛毛毛片| 555www色欧美视频| 97精品人妻一区二区三区在线| 色婷婷激情综合| 国产一级片毛片| 欧美日韩另类在线| 国产污视频在线观看| 亚洲国产婷婷综合在线精品| 久久久久亚洲AV成人| 日韩理论片中文av| 三级影片在线观看| 国产精品大尺度| www欧美com| 综合激情成人伊人| 激情小说中文字幕| 亚洲精品大片www| 久久国产精品波多野结衣| 怡红院av一区二区三区| 精品人妻在线播放| 亚洲国产美国国产综合一区二区| 久久免费黄色网址| 五月开心婷婷久久| 精品人妻一区二区三区免费看| 欧美日韩国产麻豆| 黄色片视频免费| 欧美日韩一区二区三区免费看 | 青青操国产视频| 亚洲综合男人的天堂| 国产精品99精品| 欧美日韩中文字幕在线视频| 你懂的国产在线| 欧美午夜电影一区| 国产女人18毛片18精品| 日韩视频中午一区| 午夜美女福利视频| 精品中文字幕久久久久久| 精彩国产在线| 久久精彩免费视频| 污视频在线看网站| 91大神福利视频在线| 精品3atv在线视频| 成人高h视频在线| 成人激情自拍| 欧美一区二区三区在线播放| 9999国产精品| a级免费在线观看| 首页欧美精品中文字幕| 污污视频在线免费| 99国产精品一区| 久久精品色妇熟妇丰满人妻| 亚洲精品五月天| av大全在线观看| 欧美女孩性生活视频| 草逼视频免费看| 一区二区欧美激情| 在线电影福利片| 国产成人aa精品一区在线播放| 四虎精品在线观看| 久久精品一二三区| 中文字幕亚洲精品乱码| 一本大道熟女人妻中文字幕在线 | 美女100%无挡| 亚洲精品一二三四区| 日本一区二区三区精品| 欧美一区二区视频在线观看 | 久久影院午夜论| 亚洲波多野结衣| 亚洲国产精品天堂| 国产精品乱码一区二区| 精品亚洲一区二区三区| 成人影院在线观看| 日本人成精品视频在线| 涩爱av色老久久精品偷偷鲁| 欧美一区亚洲二区| 韩国一区二区三区在线观看| 日本三级黄色网址| 99久久久国产精品免费蜜臀| 美女视频久久久| 色天天综合久久久久综合片| 精品人妻av一区二区三区| 亚洲四色影视在线观看| 多野结衣av一区| 亚洲综合av影视| 欧美aaaa视频| 三级在线免费看| 久久久美女艺术照精彩视频福利播放 | 色综合久久中文| 日本免费黄色小视频| 蜜桃视频在线观看一区二区| aa一级黄色片| 亚洲国产成人porn| 精品人妻一区二区三区浪潮在线| 亚洲偷熟乱区亚洲香蕉av| 亚洲美女久久精品| 精品国产第一页| 亚洲电影av| 少妇搡bbbb搡bbb搡打电话| 欧美国产视频在线| 精品久久久久久久久久久久久久久久| 精品国产乱码久久久久久久久| a视频在线观看免费| 91精品久久久久久久久久另类| 国模精品一区| 无码日韩人妻精品久久蜜桃| 久久亚洲一区二区三区明星换脸| 香蕉免费毛片视频| 欧美成va人片在线观看| 女同视频在线观看| www 成人av com| 亚洲天堂偷拍| 欧美性生交xxxxx| 亚洲成人免费电影| 色网站免费观看| 77777亚洲午夜久久多人| 极品一区美女高清| 男人操女人逼免费视频| 97精品视频在线观看自产线路二| 日韩精品手机在线| 亚洲伦理中文字幕| 电影在线观看一区二区| 亚洲精品在线视频观看| 久久精品国产精品青草| www.黄色com| 欧美一级xxx| 国产理论电影在线 | 超碰成人久久| 在线观看日本一区二区| 国产精品久久久久久久第一福利 | 资源网第一页久久久| 精品一区二区三区久久久| 日日噜噜夜夜狠狠久久波多野| 欧美一卡二卡三卡四卡| 操喷在线视频| 免费av一区二区三区| 免费高清在线一区| 农村黄色一级片| 亚洲国产日韩欧美在线99| 中文字幕色婷婷在线视频| 色涩成人影视在线播放| 国产最新精品免费| 日本三级欧美三级| 亚洲日本中文字幕免费在线不卡| 色猫猫成人app| 99久热在线精品视频| 91亚洲午夜精品久久久久久| 无码视频在线观看| 欧美成人激情视频| 欧美自拍视频| 国产aⅴ爽av久久久久| 亚洲一区二区三区中文字幕| 欧美孕妇性xxxⅹ精品hd| 国产精品永久免费视频| 激情视频一区二区三区| 中文字幕第24页| 日韩视频一区二区在线观看| 末成年女av片一区二区下载| 亚洲图色在线| a在线欧美一区| 国产又粗又猛又黄又爽| 国内成人精品一区| 色婷婷热久久| 亚洲精品第二页| 7777精品伊人久久久大香线蕉超级流畅 | 国产午夜亚洲精品羞羞网站| av官网在线观看| 国产xxx69麻豆国语对白| 黄色亚洲免费| 国产精品免费在线视频| 日韩成人在线视频| 久久国产精品美女| 天天操天天爱天天爽|