資料結構和演算法之單向鍊錶四 環的討論

2022-05-05 13:12:08 字數 1007 閱讀 2633

我們前邊已經討論了關於單向鍊錶的簡單功能增刪改查的實現,以及通過兩個指標獲取倒數k個節點以及合併兩個有序鍊錶的方法,接下來我們需要討論的是有關於單向鍊錶的環問題。乙個鍊錶是否有環的存在,如果有環那麼我們的環的長度是多少,它的起點又在**,這都是我們需要考慮的問題。現在我們討論第乙個問題,判斷乙個鍊錶是否有環:

一:鍊錶是否有環:

我們還是先考慮乙個思路,我們能不能通過兩個指標的思路解決這個問題,假設鍊錶有環,那麼我們在遍歷鍊錶的時候是不是永遠不會有結束的時候,一直會在結環處進行無休止的迴圈。那麼這時候我們可以考慮的是我們設定的兩個指標是不是可以仿照獲取中間節點的思想,乙個行走兩步,乙個行走一步,如果有環他們必然相遇,如果無環,那麼他們是不可能相遇的。實現**如下:

public

boolean

hascycle(node head)

//定義兩個指標位於同一起點

node first =head;

node second =head;

//對鍊錶進行遍歷

while(second.next != null

) }

return

false

;}

二:鍊錶如果有環那麼我們的鍊錶的環長度是多少:這個問題我們結合上乙個問題是非常容易解決的,在鍊錶有環的前提下,我們是必然找到了這個環的起始節點,那麼我們在這時候對於first進行停止處理,讓second繼續前行,如果再次相遇,那麼必然是對這個鍊錶進行了一圈的遍歷:

public

intcyclelength(node head)

//定義兩個節點位於首節點

node first =head;

node second =head;

//對鍊錶進行遍歷,判斷是否有環

while(second.next != null

)

return

length;}}

return 0;

}

資料結構之單向鍊錶

結構體 指標 更強大的資料結構 分類 1 頭指標式鍊錶 不實用很麻煩 2 頭結點式鍊錶 常用 節點 typedef int data 常用操作 1建立 2摧毀3增加 4刪除5查詢 6修改7逆序 ifndef linklist h define linklist h typedef enum bool...

資料結構與演算法之鍊錶(四) 約瑟夫環

在一些大的公司尤其是大的網際網路公司面試的時候,鍊錶的一些趣味演算法是經常出現。下面就來是兩個常見的面試題 1.判斷乙個單鏈表是不是存在環。includeusing namespace std struct node 建立單鏈錶鏈表 node create list int n node head ...

資料結構和演算法 單向鍊錶 雙向鍊錶的演算法實現

單向鍊錶演算法實現 includeusing namespace std typedef int typedata 單向鍊錶資料結構 typedef struct onewaylistnode onewaylistnode,onewaylist 結構相同方便區別節點和頭指標 初始化單向鍊錶 bool...