c语言实现:链表分区要求实现一个函数,将给定的整数链表,按指定的值分成前后两部分,前边的比指定的值小,后边的指定的值不小,且保持各组数据在原链表中的相对位置不变。 链表结点结构: struct ListNode{ int data; struct ListNode *next; };
时间: 2024-02-25 18:55:32 浏览: 88
以下是一个C语言实现的链表分区函数:
```c
struct ListNode* partition(struct ListNode* head, int x) {
struct ListNode *smallHead = NULL, *smallTail = NULL;
struct ListNode *largeHead = NULL, *largeTail = NULL;
struct ListNode *p = head;
while (p != NULL) {
if (p->data < x) {
if (smallHead == NULL) {
smallHead = p;
smallTail = p;
} else {
smallTail->next = p;
smallTail = p;
}
} else {
if (largeHead == NULL) {
largeHead = p;
largeTail = p;
} else {
largeTail->next = p;
largeTail = p;
}
}
p = p->next;
}
if (smallHead == NULL) {
return largeHead;
}
smallTail->next = largeHead;
if (largeHead != NULL) {
largeTail->next = NULL;
}
return smallHead;
}
```
这个函数接受一个链表的头节点和一个值x,然后将链表分成前后两部分,前半部分中的节点值小于x,后半部分中的节点值不小于x。该函数返回更新后的链表的头节点。
该函数使用四个指针,分别指向小于x的链表的头尾和大于等于x的链表的头尾。然后遍历链表,将节点插入到相应的链表中。最后将小链表的尾部指向大链表的头部,返回小链表的头部即可。
阅读全文