题目: 给定一个链表和一个值x,将链表划分成两部分,使得划分后小于x的结点在前,大于等于x的结点在后,在这两部分中要保持原链表中的结点的出现顺序;
如: 给定链表1->2->4->3->2->5->2->6 和 x=3,返回1->2->2->2->4->3->5->6;

思路如下:

1、构造两个空的链表 head1和 head2;

2、定义两个指针 pre_1 和 pre_2 分别指向这两个空链表的头结点;

3、循环遍历给定的链表head,

4、取出给定链表的头结点的next的value值与x进行比较,若是小于x则添加到链表head_1的尾部,

若是大于等于x则添加到链表head_2的尾部,然后链表head_1的尾部链接到链表head_2的头部;

整体算法的时间复杂度为O(N),空间复杂度为O(1);

public Node divideLink(Node head, int x) {

    if (null == head) {
        return null;
    }
    Node head1 = new Node();
    Node head2 = new Node();

    Node pre1 = new Node();
    //记录下链表的头节点
    pre1.next = head1;

    Node pre2 = new Node();
    pre2.next = head2;

    Node cur = head;
    while (cur != null) {
        if (cur.data < x) {
            head1.next = cur;
            head1 = head1.next;
        } else {
            head2.next = cur;
            head2 = head2.next;
        }

        cur = cur.next;
    }

    head1.next = pre2.next.next;

    return pre1.next.next;
}