快慢指针

 一、概念

     快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可让快指针每次沿链表向前移动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;
		}
	}

}
相关文章
相关标签/搜索