现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
思路:
创建两个哨兵位头结点,lessguard为链表结点值小于x的头结点,upwards为链表结点值大于等于x的头结点。cur遍历原链表。
第一次,cur指向的结点的值为7,大于5.将此结点尾插在upwardsguard的链表中,移动upwardstail
第二次:4小于5,尾插在lessguard链表中,移动lesstail
以此类推直到cur为NULL
然后连接两个链表,再使phead指向lessguard的第一个结点并返回,最后free掉lessguard和upwardsguard
代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
struct ListNode* cur = pHead;//遍历链表的指针
struct ListNode* lessguard,* upwardsguard,* lesstail,* upwardstail;
lessguard = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));//小于x的链表
upwardsguard = upwardstail = (struct ListNode*)malloc(sizeof(struct ListNode));//大于x的链表
while(cur)
{
if(cur->val < x)
{
lesstail->next = cur;
lesstail = lesstail->next;
}
else
{
upwardstail->next = cur;
upwardstail = upwardstail->next;
}
cur = cur->next;
}
lesstail->next = upwardsguard->next;将两个链表连接
upwardstail->next = NULL;//防止循环
pHead = lessguard->next;
free(lessguard);
free(upwardsguard);
return pHead;
}
};