# [86. Partition List](https://leetcode.com/problems/partition-list/) # 思路 题目要求将链表中小于x的元素移动最前面来,要求保持元素间的相对位置不变。 我们可以从前往后遍历链表,将小于x的节点取出来按照顺序组成一个新的链表,遍历完成后将这个新链表放在剩下的链表之前即可。 为了方便处理我们定义新的链表的头结点为`small_head`,剩下的链表的头结点为`big_head`,然后用指针small指向当前新链表的最后一个节点,用big指向当前剩余链表的最后一个节点。 时间复杂度O(n),空间复杂度O(1) # C++ ``` C++ class Solution { public: ListNode* partition(ListNode* head, int x) { ListNode *small_head = new ListNode(-1), *big_head = new ListNode(-1); ListNode *small = small_head, *big = big_head; while(head){ if(head -> val < x){ small -> next = head; head = head -> next; small = small -> next; } else{ big -> next = head; head = head -> next; big = big -> next; } } small -> next = big_head -> next; // 将这个新链表放在剩下的链表之前 big -> next = NULL; return small_head -> next; } }; ```