思路:
题目要求小于x的结点在前面,大于等于的在后面,同时保持原始结点相对位置。那么只需要维护两个链表,small存放小的,large存放大于等于的。
smallhead和largehead为哑结点,指向两个链表有效头结点。
遍历整个原始链表,遇到小于x的结点就链接到small链表,大于等于的链接到large链表,最后将两个链表连接起来即可。
tips:注意最后大链表尾指针指空。
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* small = new ListNode(0);
ListNode* smallHead = small;//小于x的链表头结点
ListNode* large = new ListNode(0);
ListNode* largeHead = large;//大于x的链表头结点
while (head != nullptr) {//遍历原链表
if (head->val < x) {//小于x,链接到小链表上
small->next = head;
small = small->next;
} else {//大于等于x,链接到大链表上
large->next = head;
large = large->next;
}
head = head->next;//注意原链表指针后移
}
large->next = nullptr;//注意大链表尾指针指空
small->next = largeHead->next;//小链表链接大链表
return smallHead->next;
}
};