现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
易错点:会产生环状链表
修改:
struct ListNode* partition(struct ListNode* pHead, int x)
{
//哨兵位
struct ListNode* lessHead, * lessTail, * greaterHead, * greaterTail;
lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));
lessTail->next = NULL;//指空
greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));
greaterTail->next = NULL;//指空
struct ListNode* cur = pHead;
while (cur)
{
if (cur->val < x)
{
//先连起来
lessTail->next = cur;
//再移动
lessTail = cur;
}
else
{
//先连起来
greaterTail->next = cur;
//再移动
greaterTail = cur;
}
//cur跑动
cur = cur->next;
}
//链接两部分
lessTail->next = greaterHead->next;//greaterHead为哨兵位 不存放val,连到下一个
//避免成环
greaterTail->next = NULL;
struct ListNode* newHead = lessHead->next;//记录哨兵位下一个位置
free(lessHead);
free(greaterHead);
return newHead;
}