1. 程式人生 > 實用技巧 >你可能不瞭解的java列舉

你可能不瞭解的java列舉

大家都喜歡將雙指標分為兩類,一類是快慢指標,另一類是左右指標;
其中,快慢指標主要解決一些和連結串列相關的問題,左右指標主要解決一些陣列和字串的問題,比如二分查詢這樣的。

快慢指標

快慢指標在使用的時候一般都是初始化指向連結串列的頭部,之所以有快有慢是因為後面在更新的時候跨度不一樣;
快慢指標可以用來判斷一個連結串列中是否含有環的問題,下面一起來看一下這個問題:
對於一個連結串列來說,每個結點知道下一個結點是啥,所有我們如果只採用一個指標的話並不能做到判斷是否有環;一般這種問題通常是使用快慢指標來解決,設定兩個指標,一個跑得快,一個跑得慢,如果連結串列中不含有環的話,那麼跑得快的指標最終會指向null;如果連結串列中含有環的話,那麼會出現快指標超過慢指標一圈的情況;
具體的程式碼如下所示:

public boolean check(Node head){
      Node fast,slow;
      fast=fast.next.next;
      fast=slow=head;
      while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow)
            return true;
      }
      return false;
}

第二個應用是可以用來尋找連結串列的中點,程式碼如下所示:

public Node fun(Node head){
      Node fast,slow;
      fast=slow=head;
      while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
      }
      return slow;
}

左右指標

左右指標大多數在應用的時候就是兩個索引值,一個在左,一個在右;
二分查詢就是左右指標的一個應用,和其他方式的使用主要區別就是如何更新左右指標的索引值,下面介紹兩個左右指標的應用例項,感受一下區別所在:

問題1:給定一個升序排列的有序陣列,找到兩個數使得它們相加之和等於目標數,最後返回這兩個數的索引值。

具體程式碼如下:

public int[] fun(int []nums,int target){
      int left=0;
      int right=nums.length-1;
      while(left<=right){
            if(nums[left]+nums[right]==target)
                return new int[]{left,right};
            else if(sum<target)
                 left++;
            else if(sum>target)
                  right++;      
      }
      return new int[]{-1,-1};
}

問題2:給定一個數組進行反轉;
具體的程式碼如下:

public void fun(int []nums,int target){
      int left=0;
      int right=nums.length-1;
      while(left<=right){
              int temp=nums[left];
              nums[left]=nums[right];
              nums[right]=temp;    
      }
}