在此示例中,我們將學(xué)習(xí)Java中的檢測LinkedList中是否存在循環(huán)。
要理解此示例,您應(yīng)該了解以下Java編程主題:
class LinkedList { //創(chuàng)建Node類的對(duì)象 //表示鏈表的頭部 Node head; //靜態(tài)內(nèi)部類 static class Node { int value; //將每個(gè)節(jié)點(diǎn)連接到下一個(gè)節(jié)點(diǎn) Node next; Node(int d) { value = d; next = null; } } //檢查是否存在循環(huán) public boolean checkLoop() { //在LinkedList的開頭創(chuàng)建兩個(gè)引用 Node first = head; Node second = head; while(first != null && first.next !=null) { //將第一個(gè)引用移動(dòng)2個(gè)節(jié)點(diǎn) first = first.next.next; //將第二個(gè)引用移動(dòng)1個(gè)節(jié)點(diǎn) second = second.next; //如果兩個(gè)引用相等(遇) if(first == second) { return true; } } return false; } public static void main(String[] args) { //創(chuàng)建LinkedList的對(duì)象 LinkedList linkedList = new LinkedList(); //為每個(gè)鏈表節(jié)點(diǎn)賦值 linkedList.head = new Node(1); Node second = new Node(2); Node third = new Node(3); Node fourth = new Node(4); //將鏈表的每個(gè)節(jié)點(diǎn)連接到下一個(gè)節(jié)點(diǎn) linkedList.head.next = second; second.next = third; third.next = fourth; //在LinkedList中進(jìn)行循環(huán) fourth.next = second; //打印節(jié)點(diǎn)值 System.out.print("LinkedList: "); int i = 1; while (i <= 4) { System.out.print(linkedList.head.value + " "); linkedList.head = linkedList.head.next; i++; } //調(diào)用方法檢查循環(huán) boolean loop = linkedList.checkLoop(); if(loop) { System.out.println("\n在 LinkedList 中有一個(gè)循環(huán)."); } else { System.out.println("\nLinkedList中沒有循環(huán)."); } } }
輸出結(jié)果
LinkedList: 1 2 3 4 在 LinkedList 中有一個(gè)循環(huán).
在上面的示例中,我們已經(jīng)用Java 實(shí)現(xiàn)了LinkedList。我們使用了Floyd的循環(huán)查找算法來檢查 LinkedList 中是否存在循環(huán)。
注意checkLoop()方法中的代碼。在這里,我們有兩個(gè)名為first,second的變量,它們遍歷LinkedList中的節(jié)點(diǎn)。
first - 在單次迭代中使用2個(gè)節(jié)點(diǎn)進(jìn)行遍歷
second - 在單次迭代中使用1個(gè)節(jié)點(diǎn)進(jìn)行遍歷。
兩個(gè)節(jié)點(diǎn)以不同的速度遍歷。 因此,如果LinkedList中有循環(huán),它們將相遇。