您的位置:首页 > 其它

《leetCode》:Partition List

2015-12-02 22:28 363 查看

题目

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.


思路

实现代码如下:

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     struct ListNode *next;
* };
*/
struct ListNode* partition(struct ListNode* head, int x) {
if(head==NULL||head->next==NULL){//无节点和只有一个节点,都返回
return head;
}
struct ListNode *dummy=(struct ListNode *)malloc(sizeof(struct ListNode));
if(dummy==NULL){
exit(EXIT_FAILURE);
}
dummy->next=NULL;
struct ListNode *index=dummy;
struct ListNode *cur=head;
struct ListNode *curNext=NULL;
struct ListNode *lessThan=NULL;//用来指示最右边小于x的节点
struct ListNode *LessThanNext=NULL;
struct ListNode *pre=NULL;
while(cur!=NULL){
if(cur->val<x){
if(lessThan==NULL){//要分lessThan是否为NULL
if(cur==head){//要分cur是否为头结点
dummy->next=cur;//此时cur为第一个小于x的节点
lessThan=cur;
pre=cur;
cur=cur->next;
//continue;
}
else{
dummy->next=cur;//此时cur为第一个小于x的节点
lessThan=cur;
curNext=cur->next;//将当前的下一个节点保存
cur->next=head;//指向头结点
pre->next=curNext;
cur=curNext;
}

}
else{
if(lessThan==pre){//即都是小于x,不需要进行下面的变换指针
lessThan=cur;
pre=cur;
cur=cur->next;
continue;
}
LessThanNext=lessThan->next;//先把lessThan的下一个节点保存
lessThan->next=cur;
curNext=cur->next;//将当前的下一个节点保存
cur->next=LessThanNext;
pre->next=curNext;
cur=curNext;//此时pre不需要变
lessThan=lessThan->next;//改变lessThan

}
}
else{
pre=cur;
cur=cur->next;
}

}
if(dummy->next!=NULL){
return dummy->next;

}
else{//节点中全部大于x
return head;
}
}


AC结果如下:



没有考虑到的测试用例

1、节点的value全部小于x。



2、节点的value全部大于x



3、只有一个节点



4、还有一种情况,忘记截图了,就是头结点就小于x的情况。

解决方法在程序均有体现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: