以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
C写法:
SList* PartitionLists(SList *head, int v){
assert(head != NULL);
Node* result1 = NULL;
Node* result2 = NULL;
Node* tail1 = NULL;
Node* tail2 = NULL;
Node* c = head;
while (c != NULL){
if (c->value < v){//小的尾插
if (result1 == NULL){
tail1 = result1 = c;
}
else{
tail1->next = c;
tail1 = c;
}
}
else{//大的尾插
if (result2 == NULL){
tail1 = result2 = c;
}
else{
tail2->next = c;
tail2 = c;
}
}
c = c->next;
}
if (tail1 != NULL){//tail1里面有数据
tail1->next = result2;
return result1;
}
else{
return result2;//比v 一个小的都没有
}
if (tail2 != NULL){
tail2->next = NULL;
}
else{
return result1;
}
}
JAVA写法:
public class Nowcoder { public class ListNode{ int val; ListNode next=null; ListNode(int val){ this.val=val; } } public class Partition { public ListNode partition(ListNode pHead, int x) { ListNode result1 = null; ListNode result2 = null; ListNode tail1 = null; ListNode tail2 = null; ListNode c = pHead; while (c != null) { ListNode next = c.next; if (c.val < x) {/* 小的尾插 */ c.next=null; if (result1 == null) { result1 = c; } else { tail1.next = c; } tail1 = c; } else {//大的尾插 c.next = null; if (result2 == null) { result2 = c; } else { tail2.next = c; } tail2 = c; } c =next; } if (tail1 == null) { return result2; } else { tail1.next = result2; return result1; } } } }