Partition List

本文详细介绍了链表按值分割算法的实现过程,包括初始化链表、插入元素、打印链表、释放链表资源及核心的分割链表功能。通过示例代码演示了如何根据给定值x,将链表分为两个部分,一部分包含所有小于x的节点,另一部分包含所有大于或等于x的节点,同时保持原顺序不变。

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

单词:partition 分割
说明:
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater
than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example, Given 1->4->3->2->5->2 and x = 3, return 1->2->2->4->3->5.

#include <stdio.h>
#include <stdlib.h>
typedef struct _LinkNode{
    int data;
    struct _LinkNode *next;
}LinkNode;
typedef struct _LinkList{
    LinkNode *head;
    int length;
}LinkList;
//初始化
LinkList *Init()
{
    //创建链表
    LinkList *list=(LinkList*)malloc(sizeof(LinkList));
    //创建链表节点
    LinkNode *node=(LinkNode*)malloc(sizeof(LinkNode));
    //初始化
    list->head=node;
    node->data=0;
    node->next=NULL;
    list->length=0;
    return list;
}
//插入
void Insert(LinkList *list,int pos,int data)
{
    //合法性检验
    if(list==NULL)
        return ;
    if(pos>list->length)
        pos=list->length;
    //创建辅助节点
    LinkNode *pCurrent=list->head;
    //找到pos的前一个位置
    int i=0;
    for(i=0;i<pos;i++)
    {
        pCurrent=pCurrent->next;
    }
    //创建新节点
    LinkNode *newnode=(LinkNode*)malloc(sizeof(LinkNode));
    newnode->data=data;
    newnode->next=NULL;
    //插入节点
    newnode->next=pCurrent->next;
    pCurrent->next=newnode;
    list->length++;
}
//打印
void Print(LinkList* list)
{
    //合法性检验
    if(list==NULL)
        return;
    //创建辅助节点
    LinkNode *pCurrent=list->head->next;
    //遍历打印
    int i=0;
    for(i=0;i<list->length;i++)
    {
        printf("%2d",pCurrent->data);
        pCurrent=pCurrent->next;
    }
}
//链表释放
void Free(LinkList *list)
{
    if(list==NULL)
        return;
    //创建辅助接点
    LinkNode *pCurrent=list->head->next;
    LinkNode *now=NULL;
    while(pCurrent!=NULL)
    {
        now=pCurrent->next;
        free(pCurrent);
        pCurrent=now;
    }
    list->head->next=NULL;
    list->length=0;
}
//销毁链表
void Destroy(LinkList *list)
{
    if(list==NULL)
        return;
    Free(list);
    if(list->head!=NULL)
        free(list->head);
    free(list);
}
//分割链表,小于data的节点在左边,大于或等于data的节点在右边,分割两段的原顺序保存不变
void Partition(LinkList *list,LinkList *llist1,int data)
{
    //辅助接点
    LinkNode *pCurrent=list->head->next;
    //辅助链表
    LinkList *rlist1=Init();
    //遍历,把小于data节点数据存入链表llist1,不小于的存入临时链表rlist1;
    while(pCurrent!=NULL)
    {
        if(pCurrent->data < data)
        {
            Insert(llist1,llist1->length,pCurrent->data);
        }
        if(pCurrent->data >= data)
        {
            Insert(rlist1,rlist1->length,pCurrent->data);
        }
        pCurrent=pCurrent->next;

    }
    //遍历,将临时链表的数据存入链表llist1
    pCurrent=rlist1->head->next;
    while(pCurrent!=NULL){
        Insert(llist1,llist1->length,pCurrent->data);
        pCurrent=pCurrent->next;
    }
    //销毁临时链表
    Destroy(rlist1);
}
int main()
{
    //创建链表
    LinkList *list=Init();
    LinkList *list1=Init();
    //插入数据
    Insert(list,0,2);
    Insert(list,0,5);
    Insert(list,0,2);
    Insert(list,0,3);
    Insert(list,0,4);
    Insert(list,0,1);
    //打印
    Print(list);
    printf("\n");
    //分割链表
    Partition(list,list1,3);
    Print(list1);
    //销毁链表
    Destroy(list);
    Destroy(list1);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值