2.4 题目:
以给定值x为基准,将链表分隔为两部分。所有小于x的结点排在大于或等于x结点之前。
解法:
创建两个链表,before和after。依次遍历所给链表,小于x的插入到before之前,大于等于x的插入到after之前。
然后连接两个链表即可。
链表类:
- public static class Node<E>{
- private E item;
- private Node<E> next;
- private boolean isValid = true;
- public boolean isValid() {
- return isValid;
- }
- public Node(E item) {
- this.item = item;
- }
- public E getItem() {
- return item;
- }
- public void setItem(E item) {
- this.item = item;
- }
- public Node<E> getNext() {
- return next;
- }
- public void setNext(Node<E> next) {
- this.next = next;
- }
- @Override
- public String toString() {
- return "Node [item=" + item + "]";
- }
- }
分隔排序算法函数:
- @SuppressWarnings("unchecked")
- public static <T> Node<T> partition(Node<? extends Comparable<T>> node,T x){
- Node beforeStart = null;
- Node afterStart = null;
- while(node != null){
- Node next = node.next;
- if(node.item == null){
- node = node.next;
- }
- else if(node.item.compareTo(x) < 0){
- node.next = beforeStart;
- beforeStart = node;
- }
- else{
- node.next = afterStart;
- afterStart = node;
- }
- node = next;
- }
- if(beforeStart == null)
- return afterStart;
- Node head = beforeStart;
- while(beforeStart.next != null){
- beforeStart = beforeStart.next;
- }
- beforeStart.next = afterStart;
- return head;
- }
测试用例:
- @Test
- public void test_2_4(){
- Node<Integer> head = new Node<>(0);
- createIntegerNode(head, 20);
- printNodeList(head);
- System.out.println("---------------------");
- head = LinkedListUtil.partition(head, 5);
- printNodeList(head);
- }
- private Node<Integer> createIntegerNode(Node<Integer> head,int number){
- Node<Integer> p = head;
- for(int i = 1;i < number;i++){
- if(i<(number/2)){
- p.setNext(new Node<Integer>(i));
- }
- else{
- p.setNext(new Node<Integer>(i%(number/2)));
- }
- p = p.getNext();
- }
- return head;
- }
- private <E> void printNodeList(Node<E> head){
- Node<E> node = head;
- while(node != null && node.isValid()){
- System.out.println(node.getItem());
- node = node.getNext();
- }
- }
测试结果:
以5为分隔点,原始链表为:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
分隔处理后的链表为:
4 3 2 1 0 4 3 2 1 0 9 8 7 6 5 9 8 7 6 5