141-解决链表partition

本文介绍了一种算法,如何根据给定链表和特定值x,对链表进行分割,确保小于x的节点排列在大于等于x的节点之前,同时保持原有的相对位置。通过逐步解析和实例演示,展示了如何使用C++实现ListNode类的partition函数来完成这一操作。
摘要由CSDN通过智能技术生成

题目:
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

解题思路
第一步:将链表拆分成两部分链表,一部分是小于X的节点,另外一部分是大于等于x的节点。
第二步:拼装链表

ListNode *partition(ListNode *head, int x)
{
    ListNode *head1 = new ListNode(0);//申请一个结点并初始化为0 
    ListNode *head2 = new ListNode(0);//申请一个结点并初始化为0 
    
    //将小于x的挂到head1上面 大于等于x的挂head2上面
    ListNode *p= head1, *q= head2; 
    
    while (head != NULL)
    {
        if (head->val < x)//val值小于x 
        {
            p->next = head;
            p = p->next;
        }
        else//val值大于等于x 
        {
            q->next = head;
            q= q->next;
        }
        head = head->next;//头结点向后移动 
    }
    
    p->next = head2->next;//两个子链进行拼接 
    q->next = NULL;//尾结点的next置为空 
    
    return head1->next;//返回合成后的新链的头结点 
    
}

演示图如下:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是 C 语言双向链表的快速排序实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct node { int val; struct node *prev; struct node *next; } Node; Node *partition(Node *head, Node *tail) { int pivot = tail->val; Node *i = head->prev; for (Node *j = head; j != tail; j = j->next) { if (j->val <= pivot) { i = (i == NULL) ? head : i->next; int tmp = i->val; i->val = j->val; j->val = tmp; } } i = (i == NULL) ? head : i->next; int tmp = i->val; i->val = tail->val; tail->val = tmp; return i; } void quick_sort(Node *head, Node *tail) { if (tail != NULL && head != tail && head != tail->next) { Node *p = partition(head, tail); quick_sort(head, p->prev); quick_sort(p->next, tail); } } void print_list(Node *head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } int main() { Node *head = (Node *)malloc(sizeof(Node)); head->val = 5; head->prev = NULL; head->next = (Node *)malloc(sizeof(Node)); head->next->val = 2; head->next->prev = head; head->next->next = (Node *)malloc(sizeof(Node)); head->next->next->val = 8; head->next->next->prev = head->next; head->next->next->next = (Node *)malloc(sizeof(Node)); head->next->next->next->val = 3; head->next->next->next->prev = head->next->next; head->next->next->next->next = NULL; printf("Before sorting: "); print_list(head); quick_sort(head, head->next->next->next); printf("After sorting: "); print_list(head); return 0; } ``` 解释: - `partition` 函数实现了快速排序的分区操作,其输入参数为链表头和尾节点,返回值为分区点; - `quick_sort` 函数实现了快速排序的递归操作; - `print_list` 函数用于打印链表; - 在 `main` 函数中初始化了一个双向链表,并对其进行排序。 注意: - 在 `partition` 函数中,我们选择尾节点作为基准点(pivot),这是快速排序的常规选择; - 在 `partition` 函数中,我们使用了一种经典的双指针算法,分别指向小于等于基准点和大于基准点的元素; - 在 `partition` 函数中,我们使用了链表节点值的交换,而不是节点指针的交换,因为我们需要维护链表节点的 prev 和 next 指针; - 在 `quick_sort` 函数中,我们需要判断链表头和尾是否相等,以及链表头是否为尾的下一个节点,这是递归终止条件; - 在 `main` 函数中,我们需要手动创建链表并初始化,这是为了方便演示。在实际应用中,链表可能是从其他函数或模块中传入的,或者是动态创建的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值