题目描述:
题目分析:
本题最重要的还是弄清楚链的特征,保证不能断链。这题我相当于使用了两个链来完成,其实可以在原链的基础上完成,因为一开始没想到设置虚拟头结点,所以对于第一个数就小于x的情况有点难办。后面使用两个链解决的过程中,想到了虚拟头结点,但是双链也就浪费一点空间,时间复杂度不变,所以这里不再重新写前面的实现方式了。
代码实现:
package LeeCode;
public class partition86 {
public static void main(String[] args) {
int[] nums = {2,1};
ListNode head = new ListNode(nums[0]);
ListNode node = head;
for (int i = 1; i < nums.length; i++) {
node.next = new ListNode(nums[i]);
node = node.next;
}
head = partition(head,2);
ListNode p = head;
while (p!=null){
System.out.print(p.val+"-> ");
p = p.next;
}
}
public static ListNode partition(ListNode head, int x) {
if (head==null)
return null;
ListNode p = new ListNode(x); //设置一个虚拟的头结点
p.next = head;
ListNode pre = p; //用来指向遍历到的结点的前一个结点,将不符合条件的结点去除
ListNode q = pre.next;
head = new ListNode(0); //虚拟初始化一条链的头结点
ListNode node = head; //用来构成最终链表的活动结点
while (q!=null){
if (q.val<x){
pre.next = q.next;
node.next = q;
node = node.next;
q = pre.next;
continue;
}
pre=q;
q = q.next;
}
node.next = p.next; //将实例链中剩下的大于等于x的部分的链接到末尾
return head.next; //返回时将头部虚拟节点去掉
}
}