Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.
这道题的要求:小于 x 的移到左边去,大于且等于 x 的移到右边去,左右两边保持原来的顺序。
看到discuss很多解法new了两个新结点分别存储左右两个链表,最后再把两个链表拼接起来,觉得这样做不是很合适,在链表中考察指针的使用的意义就没那么大了。
我的思路:
用一个指针p1指向当前待比较的结点,并用这个指针对整个链表进行一次迭代。用另一个指针p2指向左边部分链表的尾结点。
如果p1数据>x,p1移到下一个待比较结点。否则,将当前结点移到左边部分链表的尾结点后,并让它成为新的左链尾结点(p2后移),同时p1继续移到下一个待比较的结点
p1和p2一开始都是指向第一个结点,在迭代的过程中,只要还没找到第一个大于x的结点,这两者指向的结点都是相同的,不能执行上面的指针操作。所以还得先找到第一个大于x的结点。
x=3:
使用二级指针的实现:
class Solution {
public:
ListNode *partition(ListNode *head, int x) {
if (!head) return head;
ListNode **pp = &head;
ListNode **partOneTail = &head;
while (*pp)
{
if ((*pp)->val < x)
{
if (*pp == *partOneTail)
{
pp = &((*pp)->next);
}
else
{
ListNode *next = (*pp)->next;
(*pp)->next = *partOneTail;
*partOneTail = *pp;
*pp = next;
}
partOneTail = &((*partOneTail)->next);
}
else
{
pp = &((*pp)->next);
}
}
return head;
}
};