C语言实现单链表拆分算法:将链表拆分为两个子链表
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
原文地址: https://www.cveoy.top/t/topic/mMuV 著作权归作者所有。请勿转载和采集!