帶環單鏈表的概念:當單鏈表的尾指標指向了鍊錶上任一非尾結點時,即生成了乙個帶環單鏈表。
問題一:判斷是否帶環(通過快慢指標實現判斷,注意快指標必須是兩步,慢指標必須是一步,否則可能跨過)
問題二:求環的入口點(通過數學思想,方法是使用一指標指向開頭,一指標指向環中的相交點,每次各走一步,如此所得相交點即入口點)
問題三:約瑟夫環的決勝者問題
#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...