本题要求实现一个函数,将给定的整数链表,按指定的值分成前后两部分,前边的比指定的值小,后边的指定的值不小,且保持各组数据在原链表中的相对位置不变。 链表结点结构: struct ListNode{ int data; struct ListNode *next; }; 函数接口定义: struct ListNode* partition(struct ListNode* head, int x);
时间: 2024-02-18 17:06:05 浏览: 58
好的,这是一个链表分割的问题。可以使用两个指针分别记录小于 x 的链表和大于等于 x 的链表,最后将两个链表拼接起来即可。
以下是实现的代码:
```
struct ListNode* partition(struct ListNode* head, int x) {
struct ListNode* small_head = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* small_tail = small_head;
struct ListNode* large_head = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* large_tail = large_head;
struct ListNode* p = head;
while (p != NULL) {
if (p->data < x) {
small_tail->next = p;
small_tail = p;
} else {
large_tail->next = p;
large_tail = p;
}
p = p->next;
}
small_tail->next = large_head->next;
large_tail->next = NULL;
return small_head->next;
}
```
函数中 small_head 和 large_head 是两个哑节点,用于记录两个链表的头节点。small_tail 和 large_tail 分别是两个指针,用于记录两个链表的尾节点。p 指针用于遍历原链表。
遍历原链表,如果当前节点的值小于 x,则将其加入小于 x 的链表中;否则将其加入大于等于 x 的链表中。最后将小于 x 的链表的尾节点指向大于等于 x 的链表的头节点,然后将大于等于 x 的链表的尾节点指向 NULL。
返回 small_head->next 即为结果。
阅读全文