一、问题
力扣问题链接:分隔链表
二、解题思路
这里需要分解让你把原链表一分为二,具体来说,我们可以把原链表分成两个小链表,一个链表中的元素大小都小于 x,另一个链表中的元素都大于等于 x,最后再把这两条链表接到一起,就得到了题目想要的结果。
整体逻辑和合并有序链表非常相似:合并有序链表
二、解题代码
public ListNode partition(ListNode head, int x) {
//存放小于x的链表的虚拟头结点
ListNode dummy1 = new ListNode(-1);
//存放大于或等于x的链表的虚拟头结点
ListNode dummy2 = new ListNode(-1);
//p负责遍历原链表,类似合并两个有序链表的逻辑,将原链表分解成两个链表
ListNode p = head;
ListNode p1 = dummy1;
ListNode p2 = dummy2;
while (p != null) {
if (p.val < x) {
p1.next = p;
p1 = p1.next;
} else {
p2.next = p;
p2 = p2.next;
}
//断开原链表中的每个节点的next指针
ListNode temp = p.next;
p.next = null;
p = temp;
}
//将dummy1末位节点的next指针指向dummy2虚拟头结点next指针指向的数据,拼接两个链表
p1.next = dummy2.next;
return dummy1.next;
}