判斷單鏈是否迴圈,並且找出第一個迴圈節點,單鏈節點
介紹
判斷單鏈是否迴圈,並且找出第一個迴圈節點。
思路
【判斷單鏈是否迴圈】:如果單鏈是迴圈的,那麼迴圈部分就是封閉的。這好比一個田徑運動場,當兩個人跑步時,開始雖然有一定的間距,但他們遲早會相遇的。
順其自然的我們從中抽取一個數學模型,一個是步長Steps(對應兩人剛開始跑步時的間距);一個是判斷單鏈迴圈的條件nodeX==nodeY(兩人“相遇”)。
【找出第一個迴圈節點】:我想過好多其它方法,實現起來都比較難,後來出去騎行了兩個小時,回來後就想到藉助Hash儲存,Hash元素包含判斷,結果實現起來既容易,又好懂。
比如:就是一個迴圈單鏈,第一個迴圈節點為3。
package shuai.study.link.circle;import java.util.HashSet;import java.util.Set;class Node {String data = null;Node nextNode = null;public Node(String data, Node nextNode) {this.data = data;this.nextNode = nextNode;}}/////////////////////////////////////////////////////////////////////////////////////////class SingleCircleLink {Node firstNode = null;Node nodeX = null;Node nodeY = null;public SingleCircleLink(Node firstNode) {this.firstNode = firstNode;this.nodeX = firstNode;this.nodeY = firstNode;}public boolean isSingleCircleLink() {/* * This while block judge whether this link is circle or not. */while (nodeY != null && (nodeY = nodeY.nextNode) != null && nodeX != nodeY) {nodeX = nodeX.nextNode;nodeY = nodeY.nextNode;}/* * if Node.next is null, then it illustrates this link isn't circle link. */return nodeY != null;}public void printFirstCircleNode(boolean isSingleCircleLinkFlag) {if (isSingleCircleLinkFlag) {System.out.println("This is single circle link");Set<Node> hashSet = new HashSet<Node>();Node nodeZ = firstNode;/* * This while block will find the first circle node. */while (true) {hashSet.add(nodeZ);nodeZ = nodeZ.nextNode;if (hashSet.contains(nodeZ)) {break;}}System.out.println("The first circle node is " + nodeZ.data);} else {System.out.println("This is not single circle link");}}}//////////////////////////////////////////////////////////////////////////////////////////** * @author shengshu * */public class SingleCircleLinkApp {public static void main(String[] args) {Node node6 = new Node("6", null);Node node5 = new Node("5", node6);Node node4 = new Node("4", node5);Node node3 = new Node("3", node4);Node node2 = new Node("2", node3);Node node1 = new Node("1", node2);node6.nextNode = node3;SingleCircleLink singleCircleLink = new SingleCircleLink(node1);singleCircleLink.printFirstCircleNode(singleCircleLink.isSingleCircleLink());}}
判斷迴圈單鏈表是否包含另一條迴圈單鏈表的所有結點?
網上這方面挺多的。你搜一下。我就大概說一下吧。
迴圈鏈表的操作和線性鏈表 基本一致。
1。差別在於演算法中的尾指標指向頭結點。//這也是你判斷其是否為空白和結束的標誌。
2。同時迴圈條件的差別不是H或H->next是否為空白。而是判斷它們是否是頭結點。
我沒有直接回答。你思考一下吧。
如果你會一般的線性鏈表的話。如果你理解力還行的話。我想我應該回答了你的問題。
請看圖:
怎尋找出鏈表的迴圈部分的第一個節點
好像沒有什麼太好的辦法
可以聲明一個節點指標的數組,
每迭代一次就將當前節點指標放到數組中
並尋找下一個指標是否與數組中的某個值相等
當然要另外寫一個尋找函數