描述:
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
牛客网代码(我不理解为什么不能在leetcode上报错,555,可能因为leetcode的测试用例更多吧!!!所以稍微改动一下见下面的一段代码):
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
//申请两个链表的头尾结点
struct ListNode *lessHead,*lessTail,*moreHead,*moreTail;
//头结点为哨兵结点,所以开辟内存
lessHead=lessTail=(struct ListNode*)malloc(sizeof(struct ListNode));
lessTail->next=NULL;
moreHead=moreTail=(struct ListNode*)malloc(sizeof(struct ListNode));
moreTail->next=NULL;
//定义链表中的一个指针
struct ListNode *cur=pHead;
while(cur){
if(cur->val<x){ //当链表中的结点小于x的时候
lessTail->next=cur;
lessTail=cur;
cur=cur->next;
}
else{
moreTail->next=cur;
moreTail=cur;
cur=cur->next;
}
}
lessTail->next=moreHead->next;
free(moreHead);
moreTail->next=NULL;
struct ListNode *list=lessHead->next;
free(lessHead);
return list;
}
};
leetcode代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* partition(struct ListNode* head, int x){
//定义两个链表
struct ListNode *lessHead,*lessTail,*moreHead,*moreTail;
lessHead=(struct ListNode*)malloc(sizeof(struct ListNode));
lessTail=(struct ListNode*)malloc(sizeof(struct ListNode));
lessTail->next=NULL;
lessHead=lessTail;
moreHead=(struct ListNode*)malloc(sizeof(struct ListNode));
moreTail=(struct ListNode*)malloc(sizeof(struct ListNode));
moreTail->next=NULL;
moreHead=moreTail;
/*if(head==NULL){
return head;
}*/
struct ListNode* cur=head;
while(cur){
if(cur->val<x){
lessTail->next=cur;
lessTail=cur;
}
else{
moreTail->next=cur;
moreTail=cur;
}
cur=cur->next;
}
moreTail->next=NULL;
lessTail->next=moreHead->next;
free(moreHead);
struct ListNode *list=lessHead->next;
free(lessHead);
return list;
}