2.编写一个c语言程序,使用单链表,以给定值x为基准将单链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,不需要排序。
时间: 2023-10-26 07:19:09 浏览: 94
c代码-编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
好的,关于你的问题,以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* partition(ListNode* head, int x) {
ListNode *dummy1 = (ListNode *)malloc(sizeof(ListNode));
ListNode *dummy2 = (ListNode *)malloc(sizeof(ListNode));
ListNode *cur1 = dummy1, *cur2 = dummy2;
while (head != NULL) {
if (head->val < x) {
cur1->next = head;
cur1 = cur1->next;
} else {
cur2->next = head;
cur2 = cur2->next;
}
head = head->next;
}
cur1->next = dummy2->next;
cur2->next = NULL;
ListNode *res = dummy1->next;
free(dummy1);
free(dummy2);
return res;
}
int main() {
ListNode *head = (ListNode *)malloc(sizeof(ListNode));
head->val = 1;
head->next = (ListNode *)malloc(sizeof(ListNode));
head->next->val = 4;
head->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->val = 3;
head->next->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->next->val = 2;
head->next->next->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->next->next->val = 5;
head->next->next->next->next->next = NULL;
int x = 3;
ListNode *res = partition(head, x);
while (res != NULL) {
printf("%d ", res->val);
res = res->next;
}
printf("\n");
return 0;
}
```
这是一个简单的链表分割程序,使用dummy节点分别保存小于x和大于等于x的节点,然后将它们连接起来,并返回分割后的链表的头节点即可。
阅读全文