基本思路:在遍历过程中,用一个指针m指向最后一个小于x的节点,在一个循环中指针p跳过所有大于等于x的节点,将小于x的节点p插到m节点后,同时更新指针p和指针m。
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode *L = new ListNode(0);
L->next = head;
ListNode *m = L, *q = L, *p = head;
while (1){
while (p!=NULL&&p->val >= x){
p = p->next;
q = q->next;
}
if (m != q){
q->next = p->next;
p->next = m->next;
m->next = p;
p = q->next;
m = m->next;
}
else{
q = q->next;
p = p->next;
m = m->next;
}
}
return L->next;
}
};

本文详细解析了一种链表分区算法的基本思路与实现过程。该算法通过双指针技巧,将链表中小于指定值x的节点移动到链表的一侧,而大于等于x的节点移动到另一侧。具体实现中,使用了两个辅助指针m和q来跟踪最后一个小于x的节点和当前处理的节点,同时利用指针p遍历整个链表,通过交换节点位置完成分区操作。
309

被折叠的 条评论
为什么被折叠?



