判斷單鏈表是否有環

2021-06-05 05:47:10 字數 978 閱讀 6522

鍊錶結構:

struct list

;

(1)判斷單鏈表是否有環

採用追趕法,設定兩個指標p和q,從煉表表頭開始,p每一步走兩個節點,q每一步走乙個節點,如果鍊錶有環則p和q必相遇。

**如下

// 判斷鍊錶是否有環,時間複雜度o(n),空間複雜度o(1)

list* hasloopinlist( list* head )

else

q = q->next;

} while ( p != q );

return p;

}

(2)找到環的起始入口(交叉點)

設煉表總長度為l,煉表頭節點到交叉點的距離為x,環長為y,則l=x+y;

設節點p和q共走了s步相遇,由於p每次走兩個節點,q每次走乙個節點,因此p共走2s個節點,q共走s個節點;

設p與q相遇時,p共繞環走了n圈(n>=1),q繞環第一圈未走完,q和p相遇點距環其實節點為a=s-x;

則p所走總節點數2s滿足:2s=ny+x+a=ny+x+(s-x)=ny+s;

由上式進一步得到:ny=s=a+x   => a=ny-x;

從而相遇點順著環的方向再經過r=y-a=個節點到達環的起始入口;

由a=ny-x帶入r=y-a,得到r=x-(n-1)y,即x=r+(n-1)y;

因此若設定兩個指標,乙個從煉表頭節點開始每一步走乙個節點,另乙個從相遇點開始每一步走乙個節點,則兩指標必定在環的起始入口相遇。

根據以上分析,實現找出環起始入口的**為:

// 如果有環,返回環的起始節點,時間複雜度小於o(n),空間複雜度o(1)

list* findstartnodeofloopinlist( list* head, list* meetnode )

return p;

}

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...

判斷單鏈表是否有環

單鏈表有環是指原來的尾指標指向了該鍊錶中的任意乙個結點 不一定是頭結點,也就是說不一定是迴圈鍊錶 思路 設定兩個指標fast和slow,都從煉表頭結點出發。fast每次步進2,slow每次步進1,因此fast相對於slow的步進速度是1。若有環則二者一定會重合,若無環則fast最先為null 如下 ...