题目链接:https://www.nowcoder.com/share/jump/5018980031683455940770
📕题目要求:
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
🧠解题思路
这道题的最优解是创建两个单链表,然后对原链表中的值与X进行比较大小,依次进行合适位置的尾插,最后将较小链表的尾与较大链表的头进行链接,最最重要的是将大链表的next置空。因此不带哨兵位就会出现很多空指针的问题,会加大大家的解题难度,这道题我推荐大家使用带哨兵位的链表。
🍭代码示例
方案一代码示例如下:
ListNode* partition(ListNode* pHead, int x)
{
struct ListNode* greaterhead,*greatertail,*lesshead,*lesstail;
greatertail = greaterhead = (struct ListNode*)malloc(sizeof(struct ListNode));
lesstail = lesshead = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* cur = pHead;
while(cur!=NULL)
{
if(cur->val<x)
{
lesstail->next = cur;
lesstail = lesstail->next;
}
else
{
greatertail->next = cur;
greatertail = greatertail->next;
}
cur = cur->next;
}
lesstail->next = greaterhead->next;
greatertail->next = NULL;
pHead = lesshead->next;
free(lesshead);
free(greaterhead);
return pHead;
}
这就是我对本题的理解,如果大家有更优的解,欢迎交流,一起进步!