题目: 给定一个链表和一个值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;
}