如何用C语言编写LeetCode第86题的链表分区算法?请展示完整的代码实现和相关解释。
时间: 2024-11-09 22:16:19 浏览: 38
在《C语言实现LeetCode第86题:分区链表题解》一书中,详细介绍了如何使用C语言来解决LeetCode平台上第86题的链表分区问题。该问题要求我们对一个单向链表进行操作,使得所有小于给定值x的节点都位于大于或等于x的节点之前。这里提供一个具体的代码实现和相关解释。
参考资源链接:[C语言实现LeetCode第86题:分区链表题解](https://wenku.csdn.net/doc/1tw10s3157?spm=1055.2569.3001.10343)
首先,定义链表节点的结构体:
```c
struct ListNode {
int val;
struct ListNode *next;
};
```
接着,编写函数`partition`来实现分区操作:
```c
struct ListNode* partition(struct ListNode* head, int x) {
// 创建两个哑节点作为新链表的头
struct ListNode *before_head = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *after_head = (struct ListNode *)malloc(sizeof(struct ListNode));
before_head->next = NULL;
after_head->next = NULL;
struct ListNode *before = before_head;
struct ListNode *after = after_head;
struct ListNode *curr = head;
// 遍历原链表,根据节点值将节点分配到两个新链表中
while (curr != NULL) {
if (curr->val < x) {
before->next = curr;
before = before->next;
} else {
after->next = curr;
after = after->next;
}
curr = curr->next;
}
// 链表结束后的处理
before->next = after_head->next;
// 确保最后连接的链表部分为非循环链表
after->next = NULL;
// 返回新链表的头节点
struct ListNode *res = before_head->next;
free(before_head);
free(after_head);
return res;
}
```
以上代码中,我们创建了两个哑节点`before_head`和`after_head`,分别作为值小于x的节点和大于等于x的节点的头部。在遍历原链表的同时,我们将节点分配到这两个新链表中。遍历结束后,我们通过将`before_head->next`连接到`after_head->next`来完成分区,并确保返回的链表不是循环链表。
在实际使用中,需要确保在程序结束前释放为哑节点分配的内存,避免内存泄漏。此外,编写测试用例来验证算法的正确性也是十分必要的。
关于《C语言实现LeetCode第86题:分区链表题解》的资源,它详细地展示了如何分析和解决链表分区问题,包含了代码实现和必要的解释,适合希望通过实战练习提高C语言编程和算法分析能力的读者。
参考资源链接:[C语言实现LeetCode第86题:分区链表题解](https://wenku.csdn.net/doc/1tw10s3157?spm=1055.2569.3001.10343)
阅读全文