目录
一、题目
题目链接:链表分割_牛客题霸_牛客网 (nowcoder.com)
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
二、解题思路
注意每在连接一个节点后需要将尾的next置空,否则在连接时可能会出现没有尾的情况
// 分割尾插节点
while (cur)
{
if (cur->val >= x)// 尾插大节点
{
greattail->next = cur;
greattail = greattail->next;
cur = cur->next;
greattail->next = NULL;
}
else// 尾插 小节点
{
lesstail->next = cur;
lesstail = lesstail->next;
cur = cur->next;
lesstail->next = NULL;
}
}
三、解题代码
ListNode* partition(ListNode* pHead, int x) {
// write code here
ListNode* cur = pHead;
ListNode* lesshead = (ListNode*)malloc(sizeof(ListNode));
lesshead->next = NULL;
ListNode* greathead = (ListNode*)malloc(sizeof(ListNode));
greathead->next = NULL;
ListNode* lesstail = lesshead;
ListNode* greattail = greathead;
// 分割链表
while (cur)
{
if (cur->val >= x)
{
greattail->next = cur;
greattail = greattail->next;
cur = cur->next;
greattail->next = NULL;
}
else
{
lesstail->next = cur;
lesstail = lesstail->next;
cur = cur->next;
lesstail->next = NULL;
}
}
// 链接两链表
lesstail->next = greathead->next;
free(greathead);
ListNode* newhead = lesshead->next;
free(lesshead);
return newhead;
}