题目
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
示例:
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8
思路
遍历一遍链表,删除所有链表值小于x的链表节点,同时创建一个新节点,同步保存所有值小于x的链表节点,最后将初始链表拼接到新创建的链表后面,这样就保证了小于x的都在前面。
反思
写的倒是挺快,新创建的链表节点末尾没有初始化为NULL指针,导致自己很难找出错误。GDB也很难调,因为也不是空指针,就是没有初始化。
struct ListNode* partition(struct ListNode* head, int x){
struct ListNode* temp=NULL;
struct ListNode* current=head;
struct ListNode* prev=(struct ListNode*) malloc(sizeof(struct ListNode));
struct ListNode* originListHeadNode=prev;
prev->val=0;
prev->next=current;
struct ListNode* newListHeadNode=(struct ListNode*) malloc(sizeof(struct ListNode));
newListHeadNode->val=0;
newListHeadNode->next=NULL;
struct ListNode* newCurrent=newListHeadNode;
while(current){
if(current->val<x){
newCurrent->next=(struct ListNode*) malloc(sizeof(struct ListNode));
newCurrent->next->val=current->val;
newCurrent=newCurrent->next;
//newCurrent->next=NULL;
temp=current;
prev->next=current->next;
current=current->next;
//current->next=NULL;
free(temp);
}
else{
prev=current;
current=current->next;
}
}
newCurrent->next=NULL;
newCurrent=newListHeadNode;
while(newCurrent->next){
newCurrent=newCurrent->next;
}
newCurrent->next=originListHeadNode->next;
return newListHeadNode->next;
}