判断单链表中的元素是否递增_检测单链表中是否有环(C语言)
生活随笔
收集整理的這篇文章主要介紹了
判断单链表中的元素是否递增_检测单链表中是否有环(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语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猫的智商相当于人的几岁(宠物猫咪会记住一
- 下一篇: java object转泛型_为什么Ja