/** * 以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); }