日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

判断单链表中的元素是否递增_检测单链表中是否有环(C语言)

發布時間:2023/12/2 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 判断单链表中的元素是否递增_检测单链表中是否有环(C语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

檢測單鏈表中是否有環(C語言)


方法:雙指針法思路
  • 使用兩個指針,兩個初始時都指向鏈表的頭結點,然后one指針一次加一,另一個two指針一次加二。
  • 在鏈表有環時,two指針與one指針相等就說明有環。
  • 當one指針到達環的起始位置時,two指針已經在環中,此時,由于是環的結構,相當于two指針在追one指針, 由于每two指針每次比one指針快一, 所以,one只需再走兩個指針之間的距離的次數,two指針就可以追上one指針。距離小于環的長度。
  • 最終的循環次數小于等于n,最壞情況為n次。所以,時間復雜度是O(n)。

圖解

鏈表中環檢測算法圖

  • 當one指針進入環的初始點時,two指針可能已經在環循環多次,此時正好在圖中的位置。
  • 此時,就可以看成是two指針在追one指針,由于two每次都比比one快1,所以,在圖中1的位置可以判斷,再經過5次移動,two和one就會處于同一個位置。
  • 演示結果與預期一致。

代碼#include #include //構造結構體typedef struct list{int data;struct list *next;}*List,LNode;//函數聲明List init_list(List head);int Detection(List head);void main(){ List head; head = (LNode*)malloc(sizeof(LNode)); head = init_list(head); if(Detection(head)) printf("單鏈表中有環!"); else printf("單鏈表中無環!"); }//鏈表初始化函數List init_list(List head){int i = 1;List p = head;while(i <= 8){List s;s = (LNode*)malloc(sizeof(LNode));s->data = i;s->next = NULL;p->next = s;p = p->next;i++;} p->next = head->next->next;return head->next;}//雙指針檢測單鏈表中是否有環int Detection(List head){ //0為無環,1為有環 List one = head; if(head->next == NULL) return 0; List two = head->next->next; while(two != NULL) { one = one->next; two = two->next->next; if(one == two) return 1; } return 0;}

總結

以上是生活随笔為你收集整理的判断单链表中的元素是否递增_检测单链表中是否有环(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。