/**
	 * 以p为轴对start-end间的节点进行快排(包括start && 不包括end);
	 * 思路:
	 * 1.将头节点作为轴节点start,从start.next开始遍历,如果节点小于轴start的值,将该节点插入到轴节点后面;
	 * 2.将轴节点插入合适位置,即找到最后一个小于轴的节点,将该节点与轴节点值互换,此时就链表分为两部分,小于轴节点和大于轴节点;
	 * 3.递归的遍历2中两部分节点。
	 * 
	 * @param p
	 * @param start
	 * @param end
	 */
	private static void quickSortWithLinkedList(Node start, Node end) {

		if (start == null || start == end) {
			return;
		}
		Node last = start;
		Node cur = start.next;
		
		Node next ;

		// 1.默认start作为轴,如果index比start小则移动到start的next
		while (cur != null && cur != end) {
			next = cur.next;
			if (cur.value <= start.value) {
				if (start != last) {//为了防止第一个元素小于轴时发生的重复引用
					last.next = next;
					Node startNext = start.next;
					start.next = cur;
					cur.next = startNext;
					cur = next;
				}else{
					last = cur;
					cur = cur.next;
				}
			} else {
				last = cur;
				cur = cur.next;
			}
		}
		// 2.将轴移动到合适的位置,与小于轴的节点的值互换
		Node newIndex = start.next;
		last = start;
		// 找到轴插入的位置last,即找到最后一个小于轴的节点;newIndex != end是为了防止将end加入到计算范围中
		while (newIndex != null && newIndex != end && newIndex.value <= start.value) {
			last = newIndex;
			newIndex = newIndex.next;
		}
		//
		// 将轴与插入位置上节点的值进行交换
		int temp = last.value;
		last.value = start.value;
		start.value = temp;
		// 3.进行下一次迭代
		quickSortWithLinkedList(start, last);
		quickSortWithLinkedList(last.next, end);
	}