問題描述:
編寫代碼,以給定值x爲基準將鏈表分割成兩部分,所有小於x的結點排在大於或等於x的結點之前
給定一個鏈表的頭指針 ListNode* pHead,請返回重新排列後的鏈表的頭指針。注意:分割以後保持原來的數據順序不變。
分析:
定義四個新的節點,分別用來做頭插和尾插。
定義一個節點,他指向給定節點的頭指針。再用兩個節點 s, sl 分別作爲小於 x 的節點的頭指針和尾指針,同樣,再用兩個節點 b , bl 分別作爲小於 x 的節點的頭指針和尾指針。
當遍歷節點cur時,有幾種情況需要注意:
1. 節點的val值小於X
1)頭指針的頭結點爲空
頭指針的頭節點s指向這個節點 ,即 s= cur。
2)頭指針的頭節點不爲空
頭指針的尾節點的next(sl.next)指向這個節點 ,即 sl.next = cur , sl = cur;
2.節點的val值大於X
1) 尾指針的頭結點爲空
尾指針的頭結點b指向這個節點 ,即b = cur;
2)尾指針的頭結點不爲空
尾指針的尾結點的next(bl.next)指向這個節點 ,即 bl.next = cur , bl = cur;
當執行完循環體後,還需要再分別判斷頭指針和尾指針是否爲空。
1.頭指針爲空,那就直接輸出尾指針。
2.頭指針不爲空
1)尾指針的頭結點爲空
那麼就直接輸出頭指針
2)尾指針的頭結點不爲空
頭指針的尾節點的next(sl.next)指向 尾指針的頭結點,即 sl.next = b
尾指針的尾節點的next指向null,即 bl.next = null
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Partition {
public ListNode partition(ListNode pHead, int x) {
ListNode cur = pHead;
ListNode s = null;
ListNode sl = null;
ListNode b = null;
ListNode bl = null;
while(cur != null){
if(cur.val < x){
if(s == null){
s = cur;
}else{
sl.next = cur;
}
sl = cur;
}else{
if(b == null){
b = cur;
}else{
bl.next = cur;
}
bl = cur;
}
cur = cur.next;
}
if(s == null){
return b;
}else{
sl.next = b;
if(bl!= null){
bl.next = null;
}
}
return s;
}
}