给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
这个题思路还是比较简单的,首先需要找到大于等于x的点的前一个位置,然后保存下来,然后继续向前遍历,如果找到比x小的点,就插入到刚才保存好的点之后,然后链表跳过这个点。如果没找到就继续向前遍历。
C++源代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if(!head) return head;
ListNode *dummy = new ListNode(-1), *p = dummy;
dummy->next = head;
ListNode *s = NULL;
while(p->next && p->next->val < x) p = p->next;
s = p;
while(p->next)
{
if(p->next->val < x)
{
ListNode *tmp = p->next;
p->next = tmp->next;
tmp->next = s->next;
s->next = tmp;
s = s->next;
}
else
p = p->next;
}
return dummy->next;
}
};
python3源代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
if head==None:
return head;
dummy = ListNode(-1)
p = dummy
dummy.next = head
while p.next and p.next.val < x:
p = p.next
s = p
while p.next:
if p.next.val < x:
tmp = p.next
p.next = tmp.next
tmp.next = s.next
s.next = tmp
s = s.next
else:
p = p.next
return dummy.next