题目
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的情况。
解决方法在程序均有体现。