11.判斷單鏈表是否有環
阿新 • • 發佈:2017-05-16
兩個指針 next 測試 重載 else reader sta clas 復雜度
判斷單鏈表是否有環:
這裏也是用到兩個指針,如果一個鏈表有環,那麽用一個指針去遍歷,是永遠走不到頭的。
因此,我們用兩個指針去遍歷:first指針每次走一步,second指針每次走兩步,如果first指針和second指針相遇,說明有環。時間復雜度為O (n)。 方法
// 方法:檢測單鏈表是否有環 public boolean hasCycle(Node head) { if (head == null) { return false; } Node first = head; Node second= head; while (second != null) { first = first.next; second = second.next.next; if (first == second) {//一旦兩個指針相遇,說明鏈表是有環的
return true; } } return false; }
完整版代碼:(包含測試部分)
public class LinkListCycle { public Node head;public Node current; // 向鏈表中添加數據 public void add(int data) { // 判斷鏈表為空的時候 if (head == null) {// 如果頭結點為空,說明這個鏈表還沒有創建,那就把新的結點賦給頭節點 head = new Node(data); current = head; } else { current.next = new Node(data);// 創建新的結點,放在當前節點的後面(把新的節點和鏈表進行關聯)current = current.next;// 把鏈表的當前索引向後移動一位,此步操作完成之後,current結點指向新添加的那個結點 } } // 方法重載:向鏈表中添加結點 public void add(Node node) { if (node == null) { return; } if (head == null) { head = node; current = head; } else { current.next = node; current = current.next; } } // 方法:遍歷鏈表(打印輸出鏈表。方法的參數表示從節點node開始進行遍歷 public void print(Node node) { if (node == null) { return; } current = node; while (current != null) { System.out.println(current.data); current = current.next; } } class Node { // 註:此處的兩個成員變量權限不能為private,因為private的權限是僅對本類訪問 int data;// 數據域 Node next;// 指針域 public Node(int data) { this.data = data; } public int getData() { return data; } public void setData(int data) { this.data = data; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } } // 方法:檢測單鏈表是否有環 public boolean hasCycle(Node head) { if (head == null) { return false; } Node first = head; Node second = head; while (second != null) { first = first.next; second = second.next.next; if (first == second) { return true; } } return false; } public static void main(String[] args) { LinkListCycle listcycle = new LinkListCycle(); // 向LinkList中添加數據 for (int i = 0; i < 4; i++) { listcycle.add(i); } listcycle.add(listcycle.head); // 將頭結點添加到鏈表當中,於是,單鏈表就有環了。 System.out.println(listcycle.hasCycle(listcycle.head)); } }
11.判斷單鏈表是否有環