定值划分单链表

2019-04-06  本文已影响0人  掌灬纹

源自CC150一书,原题描述为 定值x将单链表划分为两部分,左侧都小于x,右侧都大于等于x给定链表的头指针,x;返回划分后的头指针
注意:分割后原来数据顺序不变,且不开辟新空间,即不创建新结点

思路:遍历原链表,四指针划分链表,两两指针划分左右侧链表,在相连,即左侧由两个指针划分结点值都小于x,同理右侧都大于等于x
为方便更好观察链表变化打印了前后两个链表,函数返回值还是按要求返回一个头结点
例:
5->6->3->2->1->null, 3为划分
结果为2->1->5->6->3->null
Java代码描述

public class _04定值划分单链表 {
    public static void main(String[] args) {
        int[] arr = {5, 6, 3, 2, 1};
        Node head = new Node(0);
        Node p = head;
        for (int i = 0; i < arr.length; i++) {
            p.next = new Node(arr[i]);
            p = p.next;
        }
        print(head);
        Node p_head = paration(head, 3);
        print(p_head);

    }
    
    private static Node paration(Node head, int x) {
        Node p = head;
        Node rightBegin = null;
        Node rightEnd = null;
        Node leftBegin = null;
        Node leftEnd = null;
        while(p != null) {
            int pdata = p.data;
            if(pdata < x) {
                if(leftEnd == null) {//左侧第一个元素添加
                    leftBegin = p;
                    leftEnd = p;
                }else {
                    leftEnd.next = p;
                    leftEnd = leftEnd.next;//每次指向最尾
                }
            }else {//右侧
                if(rightEnd == null) {
                    rightBegin = p;
                    rightEnd = p;
                }else {
                    rightEnd.next = p;
                    rightEnd = rightEnd.next;
                }
            }
            p = p.next;
        }
        if(leftBegin == null)//没有比目标值小的元素
            return rightBegin;
        
        leftEnd.next = rightBegin;
        rightEnd.next = null;//清尾操作
        
        return leftBegin;
    }

    private static void print(Node head) {
        Node p = head.next;
        while(p != null) {
            System.out.print(p.data + "->");
            p = p.next;
        }
        System.out.println("null");
        
    }

    private static class Node{
        int data;
        Node next;
        
        public Node(int data) {
            super();
            this.data = data;
        }
        
    }

}

上一篇下一篇

猜你喜欢

热点阅读