分隔链表
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
思路+代码+注释:
public static ListNode partition(ListNode head, int x) {
/*
思路:找到第一个大于等于x的节点a,然后在找a节点后小于x的节点将这些节点放在a节点前
preNode代表a节点的前一个节点
*/
ListNode preNode=null;
ListNode curNode=head;
ListNode a=null;
//注意首先判断不为null后,才能取值否则会出现空指针异常
if (head!=null && head.val >= x)
{
a=head;
}else {
while (curNode!=null)
{
if (curNode.next!=null && curNode.next.val >= x)
{
preNode=curNode;
a=curNode.next;
break;
}
curNode=curNode.next;
}
}
ListNode tmp=a;
while (tmp!=null)
{
//只有当前节点的下一个节点的值大于等于x才往后推一个节点,因为当下一个节点的值小于x时已经通过移动节点将当前节点的下一个节点变成了新节点所以当前节点不往后推
if (tmp.next!=null && tmp.next.val < x)
{
ListNode nextNode=tmp.next;
if (preNode!=null)
{
preNode.next=nextNode;
tmp.next=nextNode.next;
nextNode.next=a;
preNode=nextNode;
}else {
preNode=nextNode;
head=nextNode;
tmp.next=nextNode.next;
preNode.next=a;
}
}else {
tmp=tmp.next;
}
}
return head;
}