單向鍊錶中迴圈的查詢方法總結

2021-07-11 05:49:20 字數 1224 閱讀 6751

乙個單向鍊錶中可能存在迴圈,如何判斷單向鍊錶中是否存在迴圈,又如何找到迴圈部分的起始節點?如果是非迴圈鍊錶,如何找到中間節點?

本文結合網上找到的資料及自己的分析,進行了總結。

鍊錶節點定義如下:

typedef struct _node

node,*pnode;

1、判斷單向鍊錶中是否存在迴圈鍊錶

思路:設定兩個指標,初始值都指向頭節點,然後開始遍歷,乙個指標每次走一步,另乙個指標每次走兩步,如果存在迴圈鍊錶,這兩個鍊錶肯定能相遇

**://返回0表示沒有迴圈

//返回1表示有迴圈

int findloop(node *head)

return 0;

}2、找到單向非迴圈鍊錶的中間節點

注意,是非迴圈鍊錶

思路:設定兩個指標,初始值都指向頭節點,然後開始遍歷,乙個指標每次走一步,另乙個指標每次走兩步,走兩步的指標到鍊錶末尾時,走一步的指標剛好就指向了中間節點

**: node* findnolooplistmiddlenode(node *head)

return ponestep;

} 3、查詢單向迴圈鍊錶中的迴圈部分的起始節點

方法一:

首先用判斷單向鍊錶中是否存在迴圈鍊錶的思路到達相遇節點,然後設定兩個指標,分別從相遇節點和頭節點單步進行遍歷,兩個指標相遇的節點就是迴圈的起始節點

//

尋找環的入口點

nodelist findloopport(nodelist head)

if(fast==null||fast->next==null)

return

null;

//slow指向開頭,fast在相遇點

//得到入口點

slow=head;

while(slow!=fast)

return

slow;

}

方法二:

思路: 設定兩個指標 p1和p2,用p2遍歷整個鍊錶,用p1遍歷p2走過的節點,當p1等於p2->next時,p1就是迴圈部分的起始節點。

這種方法與第一種方法相比,理解起來會簡單很多,但演算法複雜度有所提高。

**://沒有迴圈返回null

//如果存在迴圈返回迴圈起始節點的指標

node* findloopnode(node *head)

pc = pc->next;

}return null;

}

單向迴圈鍊錶

單向迴圈鍊錶.cpp 定義控制台應用程式的入口點。include stdafx.h include include clinklist.h using namespace std int tmain int argc,tchar argv int n 5 測試空鍊錶 clinklistclist a...

迴圈單向鍊錶

typedef struct list list 初始化乙個迴圈單向鍊錶 void list init list head 判斷鍊錶是否為空 int is list empty list head 往迴圈單向鍊錶中插入乙個元素 prev 在prev元素後面插入 void list insert li...

單向鍊錶迴圈

include include include include includetypedef struct looplink looplink,plooplink 設定結點物件,包含兩個成員,nvalue和指向下乙個物件的指標pnext plooplink create phead nvalue 9...