链表的划分

本文介绍了一种链表划分算法,该算法能够根据给定的值X将链表划分为两部分,一部分包含所有小于X的元素,另一部分包含所有大于等于X的元素,并保持原有的顺序。通过使用两个指针来实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:给定一个链表和一个值X,将链表划分成两部分,使得划分后小于X的节点在前面,大于X的节点在后。保持原顺序不变。如:给定链表:

1 7 8 2 4 3 2 5 2 0和X=3,返回:1 2 2 2 0 7 8 4 3 5

解法:分别申请两个指针p和q,小于X的添加到p中,大于等于的添加到q中,最后将q连接到p的末端即可。

扩展:可以适用于快速排序。

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int val;
    node *next;
    node(int v):val(v),next(NULL){}
};
void print(node *hea)
{
    node *p=hea->next;
    int f=0;
    while(p)
    {
        if(f)
            printf(" ");
        printf("%d",p->val);
        p=p->next;
        f=1;
    }
    printf("\n");
}
void dt(node *T)
{
    node *pn;
    while(T)
    {
        pn=T->next;
        delete T;
        T=pn;
    }
}
void hf(node *hea,int num)
{
    node *tmp,*q=hea->next,*tail1,*tail2,*hea1,*hea2;
    int k=0,k1=0;
    tail1=new node(0);
    tail2=new node(0);
    hea1=new node(0);
    while(q)
    {
        if(q->val>=num)
        {
            tmp=new node(q->val);
            tail1->next=tmp;
            tail1=tmp;
            if(k==0)
                hea1=tmp;
            k=1;
        }
        else
        {
            tmp=new node(q->val);
            tail2->next=tmp;
            tail2=tmp;
            if(k1==0)
            {
                tmp->next=hea2->next;
                hea2->next=tmp;
            }
            k1=1;
        }
        q=q->next;
    }
    tail2->next=hea1;
    print(hea2);
    dt(hea2);
    dt(hea1);
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        node *tail,*p,*hea;
        int num;
        hea=new node(0);
        tail=new node(0);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&num);
            p=new node(num);
            tail->next=p;
            tail=p;
            if(i==0)
            {
                p->next=hea->next;
                hea->next=p;
            }
        }
        scanf("%d",&num);
        hf(hea,num);
        dt(hea);
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值