题目描述:
思路:
需要将一个链表分为两部分,前部分小于x,后部分大于x。并且节点之前的顺序不能变。所以每次向新链表添加时需要进行尾插法。分为两部分,值大于x的分为一部分,小于x的分为一部分。使用as,ae来表示大的那一部分的头和尾节点。使用bs,be来表示小的那一部分。使用中间变量cur来代替head遍历链表。当第一次插入节点时,使得bs/as=cur,并且be/ae=cur。非第一次插入则让be/ae.next=cur,be/ae=be/ae.next,be/ae始终保持在链表尾部。当所有的节点遍历完后,需要对bs进行判断,如果没有任何节点小于x,则返回as即可。注意:如果as不为空,需要将ae.next置为空,若ae.next不为空,可能造成死循环。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
if(head==null){
return null;
}
ListNode bs=null;
ListNode be=null;
ListNode as=null;
ListNode ae=null;
ListNode cur=head;
while(cur!=null){
if(cur.val<x){
if(bs==null){
bs=cur;
be=cur;
}else{
be.next=cur;
be=cur;
}
cur=cur.next;
}else{
if(as==null){
as=cur;
ae=cur;
}else{
ae.next=cur;
ae=cur;
}
cur=cur.next;
}
}
if(bs==null){
return as;
}
be.next=as;
if(as!=null){
ae.next=null;
}
return bs;
}
}