📅  最后修改于: 2023-12-03 15:11:16.160000             🧑  作者: Mango
该程序实现了对链表进行分区的功能,即将链表中所有小于给定值 val 的节点移到前面来,大于等于给定值 val 的节点移到后面来,并保持原始顺序。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* smallHead = new ListNode(0); // 新建小于 val 的链表头节点
ListNode* smallTail = smallHead; // 小于 val 的链表尾指针初始指向头节点
ListNode* bigHead = new ListNode(0); // 新建大于等于 val 的链表头节点
ListNode* bigTail = bigHead; // 大于等于 val 的链表尾指针初始指向头节点
while (head) {
if (head->val < x) { // 如果节点的值小于 val
smallTail->next = head; // 将该节点添加到小于 val 的链表中
smallTail = smallTail->next; // 链表尾指针后移
} else { // 否则
bigTail->next = head; // 将该节点添加到大于等于 val 的链表中
bigTail = bigTail->next; // 链表尾指针后移
}
head = head->next; // 遍历下一个节点
}
bigTail->next = NULL; // 将大于等于 val 的链表尾指针置空
smallTail->next = bigHead->next; // 将小于 val 的链表和大于等于 val 的链表拼接起来
return smallHead->next; // 返回小于 val 的链表
}
};
该程序使用了两个指针:小于 val 的链表的尾指针和大于等于 val 的链表的尾指针。遍历链表时,将小于 val 的节点添加到小于 val 的链表中,将大于等于 val 的节点添加到大于等于 val 的链表中。最后,将小于 val 的链表和大于等于 val 的链表拼接起来就得到了分区后的链表。