C语言:分割链表 最最最小白版

题目

编写程序以x为基准分割链表,使得所有小于x的节点排在大于或等于x的节点之前。如果链表中包含x,x只需出现在小于x的元素之后(如下所示)。分割元素x只需处于“右半部分”即可,其不需要被置于左右两部分之间。

示例

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

要求

struct ListNode
{
int val;
struct ListNode next;
};
struct ListNode
partition(struct ListNode* head, int x)
{
}

代码

#include<stdio.h>
#include<stdlib.h>
struct ListNode
{
    int val;
    struct ListNode *next;
};
struct ListNode *creat()   //指针函数
{
    struct ListNode *head, *p1, *p2;
    p1 = p2 = (struct ListNode*)malloc(sizeof(struct ListNode));
    char c;
    scanf("%d",&p1->val);
    head=NULL;
    int n=0;
    while(p1->val!=0)         //编号为0,输入结束
    {
        n=n+1;
        if(n==1)
            head=p1;            //第一个,置头指针
        else
            p2->next=p1;               //新开结点接上
        p2=p1;
        p1=(struct ListNode*)malloc(sizeof(struct ListNode));
        scanf("%d",&p1->val);

    }                         //p1指向新开结点,p2指向最后结点
    p2->next=NULL;
    return(head);
}
void print(struct ListNode *head)
{
    struct ListNode *p = head;
    while(p != NULL)
    {
        printf("%d ",p->val);
        p=p->next;
    }
    printf("\n");
}
struct ListNode* partition(struct ListNode* head, int x) {
    //保留相对位置
    typedef struct ListNode list;
    list *l1=malloc(sizeof(list));
    l1->next=NULL;
    list *head1=l1;
    list *l2=malloc(sizeof(list));
    l2->next=NULL;
    list *head2=l2;
    if(head==NULL)//保证至少有两个结点
    {
        return head;
    }
    while(head)
    {
        if(head->val < x)
        {//尾插l1
            l1->next=head;
            l1 = l1->next;//因为head一定不为null,所以l1一定不为null,同理l2
        }
        else
        {//尾插l2
            l2->next=head;
            l2 = l2->next;
        }
        head=head->next;
    }
    l1->next = head2->next;//接链
    head2->next=NULL;
    l2->next = NULL;
    return head1->next;
}

int main()
{
    struct ListNode *p;
    int v;
    p = creat();
    scanf("%d",&v);
    p = partition(p,v);
    print(p);
    return 0;
}

注意输入时后面要加上0
例如输入3 5 8 5 10 2 1 0
5
输出3 2 1 5 8 5 10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值