【牛客網OJ題】鏈表分割

問題描述:

編寫代碼,以給定值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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章