86. 分隔链表
题目
给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
解题思路
根据题目,只知道头结点和特定比较的值。
那么,可以遍历一遍链表,将比x小的放在一个链表中,大于等于x的放在另一个链表中,然后将两个链表拼接就是最后想要的结果了
代码
class Solution {
public ListNode partition(ListNode head, int x) {
// 创建虚拟节点temp1,temp2
ListNode temp1 = new ListNode(-1);
ListNode temp2 = new ListNode(-1);
// 创建指针p1,p2分别指向两个节点
ListNode p1 = temp1;
ListNode p2 = temp2;
// 创建p指针指向head节点
ListNode p = head;
// p指针不断向前走,当没走到末尾时
while( p != null ){
// 比较当前节点值与比较值x的大小
// 如果比x小,则将p1指针指向当前节点p,然后将p1指针往后移动
if(p.val < x){
p1.next = p;
p1 = p1.next;
}else{
p2.next = p;
p2 = p2.next;
}
// p指针也要往后移动
p = p.next;
}
// 当全部结束后,将大的链表拼接到小的后面
p1.next = temp2.next;
// 大的最后末尾指向null
p2.next = null;
return temp1.next;
}
}
第一次如图
第二次如图
一直到最后