划分链表的第二种方法

他的做法是通过两个指针,把大的节点换到后面。 这个做法需要注意的是while(end.next!=endtwo)和if(endtwo.val>=x)这两行代码

while循环的作用是当前面大的节点都换到最后之后,如果begin的下一个节点是原链表的最后节点,那么退出循环。

退出循环之后,会有两种情况。

第一种:如果endtwo原链表的最后节点的值是小于x的,那么就直接输出链表。任务完成。

第二种:if(endtwo.val>=x)代码的作用体现在第二种情况。如果endtwo节点的值大于等于x,那么就需要把endtwo节点换到最后面。

总结:链表换节点的操作不够熟练。


/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param x int整型 
     * @return ListNode类
     */
    public ListNode partition (ListNode head, int x) {
        // write code here
       if(head==null||head.next==null){
            return head;
       }
       ListNode newHead=new ListNode(-1);
       ListNode begin=newHead;
        begin.next=head;
       ListNode end=head;
        while(end.next!=null){
            end=end.next;
        }
        ListNode endtwo=end;
        while(begin.next!=endtwo){
       if(begin.next.val<x){
                begin=begin.next;
            }else{
                end.next=begin.next;
                begin.next=end.next.next;
                end.next.next=null;
                end=end.next;
            }
        }
        if(endtwo.val>=x){
            end.next=endtwo;
            begin.next=endtwo.next;
            endtwo.next=null;
        }
        return newHead.next;
    }
}