快慢指針

 一、概念

     快慢指針中的快慢指的是移動的步長,即每次向前移動速度的快慢。例如可讓快指針每次沿鏈表向前移動2,慢指針每次向前移動1次。 java

二、典型應用

    快慢指針典型應用有在有序鏈表中尋找中位數和判斷單鏈表是否爲循環鏈表。話很少說直接上代碼。 node

package test.algorithm.FastSlowPointer;

public class FastSlowPointer2 {

	public static void main(String[] args) {
		
		// 聲明鏈表
		Node header = new FastSlowPointer2.Node(1);
		Node pointer = header;
		
		// 初始化循環鏈表
		for(int i=2;i<13;i++){
			pointer.next = new FastSlowPointer2.Node(i);
			pointer = pointer.next;
		}
		//設置循環鏈表
		pointer.next = header;
		printList(header);
		
		Node fast = header;
		Node slow = header;
		
		//快慢指針典型應用1 快速獲取不定長鏈表中間節點的值
		while(true){
			
			if(fast.next!=null && fast.next.next!=null ){
				//快指針步長爲2
				fast = fast.next.next;
				//慢指針步長爲1
				slow = slow.next;
				if(fast.next==header || fast.next.next==header){
					break;
				}
			}else{
				//非循環鏈表,next爲空即到鏈表末尾,跳出循環
				break;
			}
		}
		//慢指針的值就是鏈表中間值
		System.out.println("快指針的值:"+fast.num);
		System.out.println("慢指針的值:"+slow.num);
		
		//快慢指針典型應用2 判斷鏈表是否循環鏈表
		fast = header;
		slow = header;
		while(true){
			
			if(fast.next!=null && fast.next.next!=null){
				//快指針步長爲2
				fast = fast.next.next;
				//慢指針步長爲1
				slow = slow.next;
				
				//原理:若是有環,快指針早晚都會與慢指針相遇。
				//(田徑場賽跑,當快的領先慢的一圈時二者就會相遇)
				if(fast==slow){
					System.out.println("該鏈表是循環鏈表");
					break;
				}
			}else{
				//非循環鏈表,next爲空即到鏈表末尾,跳出循環
				System.out.println("該鏈表不是循環鏈表");
				break;
			}
		}
	}
	
	/**
	 * 打印鏈表
	 * @param node
	 */
	static void printList(Node header){
		Node pointer = header;
		do{
			System.out.print(pointer.num+" ");
			pointer = pointer.next;
		}while(pointer!=null && pointer!=header);
		System.out.println();
	}
	
	
	static class Node{
		private int num;
		private Node next;
		
		public Node(int num){
			this.num=num;
		}
	}

}
相關文章
相關標籤/搜索