编写一个程序使用单链表 将单链表按基准划分,以单链表的首节点值x为基准将该单链表分割为两部分,使所有小于x的结点排在大于或等于x的结点之前。用C语言写 例如 输入a b c d e f g h
时间: 2024-10-08 20:02:36 浏览: 32
c代码-编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
在C语言中,我们可以创建一个函数来实现这个功能。首先,我们需要定义一个结构体表示链表节点,并提供一些基本操作如添加节点和比较节点值。然后,我们可以在一个新链表中遍历原链表,根据节点值与基准值的关系将其插入到两个链表的适当位置。以下是简单的伪代码和示例:
```c
// 定义链表节点结构
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
// 插入节点到链表
void insertToList(ListNode** head, int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = *head;
*head = newNode;
}
// 比较并分割链表
void splitList(ListNode** list, int x) {
ListNode* lessThanX = NULL;
ListNode* greaterEqualX = NULL;
// 遍历链表
ListNode* current = *list;
while (current != NULL) {
if (current->val < x) {
insertToList(&lessThanX, current->val);
} else {
insertToList(&greaterEqualX, current->val);
}
current = current->next;
}
// 设置新的头节点
*list = greaterEqualX;
}
int main() {
// 创建输入链表,假设它们已经初始化
ListNode* inputList = ...; // a -> b -> c -> d -> e -> f -> g -> h
// 分割链表
int x = ...; // 例如 x = 4
splitList(&inputList, x);
// 打印分割后的链表
ListNode* currentLess = lessThanX;
printf("小于或等于 %d 的链表: ", x);
while (currentLess != NULL) {
printf("%d ->", currentLess->val);
currentLess = currentLess->next;
}
printf("\n");
currentGreaterEqual = greaterEqualX;
printf("大于或等于 %d 的链表: ", x);
while (currentGreaterEqual != NULL) {
printf("%d ->", currentGreaterEqual->val);
currentGreaterEqual = currentGreaterEqual->next;
}
printf("\n");
return 0;
}
```
阅读全文