⭐️ 往期相关文章
💫链接1:链表中倒数第k个结点(快慢指针问题)
💫链接2:leetcode 876.链表的中间结点(快慢指针问题)
💫链接3:leetcode 206.反转链表
💫链接4:leetcode 203.移除链表元素
💫链接5:数据结构-手撕单链表+代码详解
⭐️ 题目描述
🌟 牛客链接:链表分割
1️⃣ 代码:
思路:不采用带哨兵卫的头结点。准备一个记录小于目标的值的头指针尾指针(这里尾指针记录每次尾插过后的新的尾),再准备一个大于等于目标值的头指针尾指针(这里尾指针记录每次尾插过后的新的尾)主要为了方便尾插,不用每次找尾。但是要考虑第一次尾插情况,因为第一次为 NULL
需要特殊处理。最后把记录小数的尾指针和记录大数的头指针链接即可。还有要考虑极端情况,当链表中所有数都大于目标值时,那么直接返回记录大数的头指针。小于同理。还有一种特殊情况是,大数的尾结点里的 next
指针可能指向其他元素,防止这种环的问题产生,所以要把大数的尾指针置为 NULL
。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// 5 3 7 8 2 1 x = 4
// 3 2 1 5 7 8
// 新的头
struct ListNode* largeHead = NULL;
struct ListNode* smallHead = NULL;
// 记录大的数尾插位置
struct ListNode* largeCur = NULL;
// 记录小的数尾插位置
struct ListNode* smallCur = NULL;
struct ListNode* cur = pHead;
while (cur != NULL) {
if (cur->val < x) {
if (smallCur == NULL) {
smallCur = cur;
smallHead = smallCur;
} else {
smallCur->next = cur;
smallCur = smallCur->next;
}
} else {
if (largeCur == NULL) {
largeCur = cur;
largeHead = largeCur;
} else {
largeCur->next = cur;
largeCur = largeCur->next;
}
}
cur = cur->next;
}
// 如果全部数都比目标数大
if (smallHead == NULL) {
return largeHead;
}
// 如果全部数都比目标数小
if (largeHead == NULL) {
return smallHead;
}
// 连接
smallCur->next = largeHead;
// 尾断开
largeCur->next = NULL;
return smallHead;
}
};