有環鏈表問題 確定有環鏈表的環起點,環長及柄長

2021-06-06 13:53:53 字數 1403 閱讀 7317

#include #include using namespace std;

struct linknode;

typedef linknode* linklist;

void insertlist(linklist &list , int data)//插入(建立)鍊錶

else }

//circlestart是環的起點,circlelen是環的長度,binglen是柄的長度

//一。快慢指標判斷是否有環;

//二。如果有環,第一次相遇後,繼續按照21的步長走,再次相遇時,迴圈的次數即為環長

//三。第二次相遇後,p指向煉表頭list,然後p和q都以步長為1繼續走,直到p==q,走的步數即為柄長

//四。環長+柄長=鍊錶節點數

bool iscircle(linklist list, linklist &circlestart, int &circlelen, int &binglen)//判斷是否有環,如果有環,求出環的起點

if(p==q)//有環

//求環起點及柄長

binglen=0;

p=list;

while(p!=q)

circlestart=p;

return true;

} else //無環

return false;

}void main()

{ linklist first=null;

linklist startnode;

int circlelen=0;

int binglen=0;

insertlist(first,10);

insertlist(first,12);

insertlist(first,-11);

insertlist(first,45);

insertlist(first,23);

insertlist(first,75);

insertlist(first,66);

insertlist(first,82);

//無環

if(iscircle(first,startnode, circlelen, binglen))

cout<

p=p->next;

linklist q=first;

for(int i=1; i<=2; i++)

q=q->next;

p->next=q;

if(iscircle(first,startnode,circlelen, binglen))

cout<

執行結果:

有環鏈表的環起點

用兩個指標,乙個快指標一次走兩步,乙個慢指標一次走一步。快慢指標可以重合表示鍊錶有環,此時距離環起點的距離和起點距離環起點的距離相等。include bits stdc h using namespace std struct list list beginofcircle list p1,list...

有環單鏈表

單鏈表中可能存在環,那麼如何判斷單鏈表中是否有環呢?若單鏈表中存在環,怎麼樣確定環的位置?如果乙個單鏈表中存在環,在遍歷鍊錶時,一旦進入環,就開始迴圈遍歷環上的節點。如果只用乙個指標來遍歷單鏈表,我們無法判斷單鏈表中是否存在環。用兩個指標就可以完成這個任務。設有兩個指標p1,p2。初始時p1和p2均...

單鏈表是否有環問題

有很多種方式解決問題,我這裡只說一種方法 使用p q兩個指標,p每次向前走一步,q每次向前走兩步,若在某時候p q,則存在環,如圖 實現 include include define len 8 typedef struct node node t int has loop2 node t head...