帶環單鏈表及單鏈表的相交

2021-07-03 20:12:29 字數 1240 閱讀 8389

帶環單鏈表的概念:當單鏈表的尾指標指向了鍊錶上任一非尾結點時,即生成了乙個帶環單鏈表。

問題一:判斷是否帶環(通過快慢指標實現判斷,注意快指標必須是兩步,慢指標必須是一步,否則可能跨過)

問題二:求環的入口點(通過數學思想,方法是使用一指標指向開頭,一指標指向環中的相交點,每次各走一步,如此所得相交點即入口點)

問題三:約瑟夫環的決勝者問題

#includeusing namespace std;

struct node

;typedef node* plist;

node* createnode(int x)

void push_back(plist &head, int x)

else }

node* find(plist head, int x)

cur = cur->_next;

} return null;

}node* judgehascircle(plist head)

if (fast != null)

return temp;

} else

return null;

}//約瑟夫環遊戲

node* joe(plist head, int k)

if (fast != null)

dead = temp->_next;

temp->_next = temp->_next->_next;

temp = temp->_next;

delete dead;

dead = null;

} return temp;

} else

return null;

}void test1()

}void test2()

int main()

單鏈表相交的概念:即兩條單鏈表存在完全重合的部分,而不是交叉某一點。

問題1:不帶環的相交

問題2:帶環的相交(注:當為帶環單鏈表相交時,必須是兩個單鏈表都有環,不可能存在一者有環,一者無環的情況。並且,相交之後只可能存在乙個環,不可能出現多個環的情況)

問題1的解決:(因為兩者相交後,必然有一段一直到尾的部分重合,所以,可以根據尾結點判斷重合)

問題2的解決:(同上面求環是否存在的情況,通過兩次判斷slst1和slist2,分別找出它們環中的乙個結點,再固定其一,另乙個繞環走,當出現兩結點重合情況,則為相交,其它情況皆為不相交)

1 6帶環單鏈表

定義乙個集合用來存放結點的引用,並將其初始化為空,從鍊錶的頭結點開始向後遍歷,每遍歷到乙個結點就判斷集合中是否有這個結點的引用,如果沒有,說明這個結點是第一次訪問,還沒有形成環,那麼將這個結點的引用新增到集合中去。如果在集合中找到了同樣的結點,那麼說明這個結點已經被訪問過了,於是就形成了環。這種方法...

一 單鏈表 帶環單鏈表的詳細講解

今天看了一篇關於帶環單鏈表精講的文章,在這裡給大家做乙個總結。之前看過很多有關單鏈表帶環的文章,但是有些文章講的太文章化,不容易理解,理論性太強。接下來我會用最簡單通俗易懂的語言解析這個問題。當你拿到乙個單鏈表的資料資訊時,我相信大部分的人都會選擇去判斷一下這個單鏈表是否有環?這也是最基本的反應。下...

帶環單鏈表求中點

首先,對於乙個n節點的單鏈環,如果給定乙個開始節點n0,然後用a,b兩個指標,分別以1和2的步長遍歷,那麼在a環了多少圈 m a距離n0有乙個怎麼樣的偏移量 offset 的情況下,a,b會重合呢?即指向同乙個節點。讓我們跳過費神的數學推導證明什麼的,先給出答案吧。在a走完一圈之後,a,b會回到n0...