如何做好单链表的分割

单链表的分割
将一个单链表以某个元素基准分割为两个链表
提示:
1输入若干数值创建一一个单链表(-1表示结束)
2输出该初始单链表
3输入一一个基准值X
4分割为两个单链表(一个单链表的元素值均小于基准,另一个单链表的元素值均大于等于基准)
5输出分割后的两个链表

供参考:

#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LinkNode;

void InitList(LinkNode **L)
{
    (*L) = (LinkNode *)malloc(sizeof(LinkNode));
    (*L)->next = NULL;
}

void CreateList(LinkNode *L)
{
    LinkNode *p = L,*pt = NULL;
    ElemType x;
    printf("输入若干数值创建一个单链表(-1表示结束):");
    while(1){
        scanf("%d", &x);
        if (x == -1)  break;
        pt = (LinkNode *)malloc(sizeof(LinkNode));
        pt->next = NULL;
        pt->data = x;
        p->next = pt;
        p = pt;
    }
}

void DispList(LinkNode *L)
{
    LinkNode *p = L->next;
    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

void Split1(LinkNode *L1, LinkNode *L2)
{
    ElemType x;
    LinkNode *pL1 = L1,*pnL1 = L1->next,*pL2 = L2,*pL = NULL;
    printf("输入一个基准值x:");
    scanf("%d", &x);
    while(pnL1 != NULL){
        pL = pnL1;
        pnL1 = pnL1->next;
        pL->next = NULL;
        if(pL->data < x){
            pL1->next = pL; //链表 L1 ,元素值 < 基准值
            pL1 = pL;
        }
        else{
            pL2->next = pL; //链表 L2 ,元素值 >= 基准值
            pL2 = pL;
        }
    }
}
int main()
{
    LinkNode *L1,*L2;
    InitList(&L1);
    InitList(&L2);

    CreateList(L1);
    DispList(L1);

    Split1(L1, L2);
    DispList(L1);
    DispList(L2);

    return 0;
}

参考GPT和自己的思路:

好的,针对您提出的问题,我可以给出一个解答。

如何做好单链表的分割?

  1. 首先,您需要输入一些数值来创建一个单链表,-1表示结束。可以使用链表节点来表示单链表中每个元素的值和指针。
  2. 创建好单链表后,您需要输出该初始单链表,以便更好地了解单链表的结构。
  3. 输入一个基准值X,作为分割单链表的依据。
  4. 对单链表进行分割,分成两个链表,其中一个链表的元素值都小于基准值X,另一个链表的元素值都大于等于基准值X。这可以通过遍历单链表,根据元素值与基准值的大小关系来进行划分。
  5. 输出分割后的两个单链表,以便进一步处理或操作。

综上所述,做好单链表的分割需要先创建好链表,然后根据基准值来划分链表,最后输出分割后的两个链表。希望我的答案能对您有所帮助。

首先遍历链表找到分割的位置,把分割前的节点next指针指向空。分割处的节点用新的head指针保存