C语言实现单链表拆分算法:将链表拆分为两个子链表

本算法使用C语言实现将一个带头结点的单链表A分解为两个具有相同结构的新链表B、C。B表包含A表中小于等于指定数的结点,而C表包含A表中大于指定数的结点。算法保持原链表元素的相对顺序,并利用原链表的节点。

思路:

扫描链表,小于等于指定数的加入链表B,大于指定数的加入链表C,最后输出两个链表的长度和元素即可。

C++ 代码:

// 定义链表节点结构
struct Node {
    int data;
    Node* next;
};

// 拆分链表函数
void splitList(Node* head, int target, Node** headB, Node** headC) {
    *headB = NULL;
    *headC = NULL;
    Node* tailB = NULL;
    Node* tailC = NULL;

    // 遍历链表
    while (head != NULL) {
        // 小于等于指定数的节点加入链表B
        if (head->data <= target) {
            if (*headB == NULL) {
                *headB = head;
                tailB = head;
            } else {
                tailB->next = head;
                tailB = head;
            }
        } else { // 大于指定数的节点加入链表C
            if (*headC == NULL) {
                *headC = head;
                tailC = head;
            } else {
                tailC->next = head;
                tailC = head;
            }
        }

        head = head->next;
    }

    // 链表B、C的尾节点指向NULL
    if (tailB != NULL) {
        tailB->next = NULL;
    }
    if (tailC != NULL) {
        tailC->next = NULL;
    }
}

// 测试代码
int main() {
    // 创建链表A
    Node* headA = new Node{7, NULL};
    headA->next = new Node{3, NULL};
    headA->next->next = new Node{9, NULL};
    headA->next->next->next = new Node{1, NULL};
    headA->next->next->next->next = new Node{5, NULL};

    // 指定拆分数值
    int target = 3;

    // 拆分链表
    Node* headB = NULL;
    Node* headC = NULL;
    splitList(headA, target, &headB, &headC);

    // 输出链表B、C的长度和元素
    // ...
    return 0;
}

输入格式:

依次输入链表A的长度、链表A的元素(无序的整数)、链表拆分比较的指定整数。

输出格式:

输出链表B、C的长度和元素。

输入样例:

5
7 3 9 1 5
3

输出样例:

2
3 1
3
7 9 5
C语言实现单链表拆分算法:将链表拆分为两个子链表

原文地址: https://www.cveoy.top/t/topic/mMuV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录