题解 | #牛群分隔#
牛群分隔
https://www.nowcoder.com/practice/16d9dc3de2104fcaa52679ea796e638e
考察的知识点:分割链表、修改节点的指针指向;
解答方法分析:
- 创建两个新的链表节点
small和large,作为分割后的链表的头节点。 - 使用两个指针
sHead和lHead分别指向small和large的初始位置,以便最后返回结果。 - 遍历原始链表
head,若当前节点的值小于x,则将其连接到small链表的末尾,并更新指针small。否则,将其连接到large链表的末尾,并更新指针large。 - 遍历完成后,将
large链表的末尾指向NULL,并将small链表的末尾连接到large链表的开头,即small->next = lHead->next。 - 最后返回
sHead->next,即分割后的链表的头节点。
所用编程语言:C++;
完整编程代码:↓
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param x int整型
* @return ListNode类
*/
ListNode* cow_partition(ListNode* head, int x) {
ListNode* small = new ListNode(0);
ListNode* sHead = small;
ListNode* large = new ListNode(0);
ListNode* lHead = large;
while (head) {
if (head->val < x) {
small->next = head;
small = small->next;
} else {
large->next = head;
large = large->next;
}
head = head->next;
}
large->next = NULL;
small->next = lHead->next;
return sHead->next;
}
};


