题目来源
面试题 02.04. 分割链表
题目描述
题目解析
双指针
pre指针的左边是小于x的元素【包括pre】 cur是当前正在比较的元素:
如果cur.val >= x,cur = cur.next 如果cur.val< x,pre.next的值和cur的值交换,pre = pre.next,cur=cur.next
struct ListNode {
int val;
ListNode * next;
ListNode ( ) : val ( 0 ) , next ( nullptr ) { }
ListNode ( int x) : val ( x) , next ( nullptr ) { }
ListNode ( int x, ListNode * next) : val ( x) , next ( next) { }
} ;
ListNode* partition ( ListNode* head, int x) {
if ( head == NULL || head- > next == NULL ) {
return head;
}
ListNode * dummy = new ListNode ( - 1 ) ;
dummy- > next = head;
ListNode * pre = dummy, * iter = dummy- > next;
while ( iter) {
if ( iter- > val < x) {
int bk = pre- > next- > val;
pre- > next- > val = iter- > val;
iter- > val = bk;
pre = pre- > next;
}
iter = iter- > next;
}
return dummy- > next;
}
class Solution {
public ListNode partition ( ListNode head, int x) {
if ( head == null) {
return head;
}
ListNode pre = new ListNode ( - 1 ) ;
pre. next = head;
ListNode cur = head;
while ( cur != null) {
if ( cur. val < x) {
int t = pre. next. val;
pre. next. val = cur. val;
cur. val = t;
pre = pre. next;
}
cur = cur. next;
}
return head;
}
}