鏈表檢測環算法,找到環中的出口節點

  • 如何判斷一個鏈表有環

  方法是使用快慢指針,經過一個slow指針(每次都指向下一個),一個quick指針(每次都指向下面兩個)java

   由於假設有環的話,quick會追上slow指針node

   找到環出口就是經過slow指針指向頭節點,quick指針指向以前環的交叉點,而後一直以相同速度(慢指針的速度)ui

     遍歷直到相遇這樣找到的就是出口節點this

  ps:慢指針遍歷速度爲每次一個節點,快指針則是遍歷兩個節點spa

 

    java實現方法以下指針

 1  2 
 3 import org.junit.Test;  4 
 5 public class Main5 {  6     // node
 7     private static class node {  8         int val;  9         node next = null; 10 
11         public node(int a) { 12             this.val = a; 13  } 14  } 15 
16     // 17     public static node create() { 18         // 建立
19         node first = new node(0); 20         node node = first; 21         int i = 1; 22         while (i < 10) { 23             node.next = new node(i); 24             node = node.next; 25             i++; 26  } 27         i = 0; 28         node node2 = first; 29         while (i < 6) { 30             if (i == 5) { 31                 node.next = node2; 32             } else { 33                 node2 = node2.next; 34  } 35             i++; 36  } 37 
38         return first; 39  } 40     // 41  @Test 42     public void test_circle() { 43         node first = create(); 44         // 快慢指針方法判斷是否爲環
45         node quick = first; 46         node slow = first; 47         int i = 0; 48         while (i < 1000) { 49             quick = quick.next.next; 50             slow = slow.next; 51             if (quick == slow) { 52                 System.out.println("這個是一個環"); 53                 break; 54  } 55             i++; 56  } 57  } 58     //
59     //主要是經過快慢指針來判斷,慢指針從first節點觸發,快指針從交叉點出發,最後的交點就是出口節點
60  @Test 61     public void test_getNode() { 62         node first = create(); 63         
64         // 快慢指針方法判斷是否爲環
65         node jiaodian = null; 66         node quick = first; 67         node slow = first; 68         int i = 0; 69         while (i < 1000) { 70             quick = quick.next.next; 71             slow = slow.next; 72             if (quick == slow) { 73                 break; 74  } 75             i++; 76  } 77         // 78         slow = first; 79         while(i<1000) { 80             slow = slow.next; 81             quick = quick.next; 82             if(slow == quick) { 83                 System.out.println("出口節點"+slow.val); 84                 break; 85  } 86  } 87  } 88 }

  

  • 第二個問題就是判斷兩個鏈表是否有交點

    判斷仍是很簡單的,只要將兩個鏈表遍歷到尾節點,若是尾節點相同,這樣就證實這兩個鏈表是有交點的code

  如何找到兩個鏈表相交的節點?blog

  方法:遍歷兩個鏈表的長度,而後長鏈表長度減去短鏈表長度爲K,讓長鏈表減去K,而後兩個鏈表逐個對比ci

  Java代碼get

  

 1 @Test  2     public void test() {  3         //建立兩個鏈表
 4         node first1 = new node(0);  5         node node1 = first1;  6         node first2 = new node(0);  7         node node2 = first2;  8         int i=0;  9         while(i<5) { 10             node1.next = new node(i); 11             i++; 12  } 13         i=0; 14         while(i<5) { 15             node2.next = new node(i); 16             i++; 17  } 18         node ban = new node(6); 19         node node3 = ban; 20         i=0; 21         while(i<5) { 22             node3 = new node(i+5); 23             i++; 24  } 25         node1.next = ban; 26         node2.next = ban; 27         //
28         //這裏是判斷
29         int length_1 = 0; 30         int length_2 = 0; 31         node1 = first1; 32         node2 = first2; 33         while(node1 != null) { 34             length_1++; 35             node1 = node1.next; 36  } 37         while(node2 != null) { 38             length_2++; 39             node2 = node2.next; 40  } 41         
42         int k = 0; 43         if(length_1>=length_2) { 44             k = length_1-length_2; 45             int j = 0; 46             while(j<k) { 47                 first1 = first1.next; 48                 j++; 49  } 50         }else { 51             k = length_2 - length_1; 52             int j = 0; 53             while(j<k) { 54                 first2 = first2.next; 55                 j++; 56  } 57  } 58         while(true) { 59             if(first1 == first2) { 60                 System.out.println("共同節點"+first1.val); 61                 break; 62  } 63             first1 = first1.next; 64             first2 = first2.next; 65  } 66     }
相關文章
相關標籤/搜索