你可能不瞭解的java列舉
阿新 • • 發佈:2020-09-02
大家都喜歡將雙指標分為兩類,一類是快慢指標,另一類是左右指標;
其中,快慢指標主要解決一些和連結串列相關的問題,左右指標主要解決一些陣列和字串的問題,比如二分查詢這樣的。
快慢指標
快慢指標在使用的時候一般都是初始化指向連結串列的頭部,之所以有快有慢是因為後面在更新的時候跨度不一樣;
快慢指標可以用來判斷一個連結串列中是否含有環的問題,下面一起來看一下這個問題:
對於一個連結串列來說,每個結點知道下一個結點是啥,所有我們如果只採用一個指標的話並不能做到判斷是否有環;一般這種問題通常是使用快慢指標來解決,設定兩個指標,一個跑得快,一個跑得慢,如果連結串列中不含有環的話,那麼跑得快的指標最終會指向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;
}
}