题解 | #划分链表#
划分链表
http://www.nowcoder.com/practice/1dc1036be38f45f19000e48abe00b12f
划分链表的第二种方法
他的做法是通过两个指针,把大的节点换到后面。 这个做法需要注意的是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;
}
}