📌  相关文章
📜  用于围绕给定值对链表进行分区并保持原始顺序的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:11:16.160000             🧑  作者: Mango

用于围绕给定值对链表进行分区并保持原始顺序的 C++ 程序

程序介绍

该程序实现了对链表进行分区的功能,即将链表中所有小于给定值 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 的链表拼接起来就得到了分区后的链表。