1. 题目描述
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置
- 示例 1
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
- 示例 2
输入:head = [2,1], x = 2
输出:[1,2]
2. 解题思路
- 遍历 head, 定义两个新的链表, minListNode 保存 < x 的结点, maxListNode用于保存 >= x 的结点
- 然后将 minListNode 的尾结点 tailMinListNode 的 next 指向 maxListNode 的头结点
- 最后将 maxListNode 的尾结点 tailMaxListNode 的 next 指向空, 此处尾结点原有的 next 可能指向其他结点, 形成数据闭环
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
if (head == null || head.next == null) {
return head;
}
// 用于保存 < x 的结点
ListNode minListNode = new ListNode(-9999);
// 用于保存 >= x 的结点
ListNode maxListNode = new ListNode(-9999);
// 用于保存 < x 链表的尾结点
ListNode tailMinListNode = minListNode;
// 用于保存 >= x 链表的尾结点
ListNode tailMaxListNode = maxListNode;
while (head != null) {
// < x 的结点保存到 minListNode
if (head.val < x) {
tailMinListNode.next = head;
// 将 head 赋值给 tailMinListNode 作为链表的尾结点
tailMinListNode = head;
} else {
// < x 的结点保存到 minListNode
tailMaxListNode.next = head;
// 将 head 赋值给 tailMaxListNode 作为链表的尾结点
tailMaxListNode = head;
}
head = head.next;
}
// 将 minListNode 的尾结点 tailMinListNode 的 next 指向 maxListNode 的头结点
tailMinListNode.next = maxListNode.next;
// 将 maxListNode 的尾结点 tailMaxListNode 的 next 指向空, 此处尾结点原有的 next 可能指向其他结点, 形成数据闭环
tailMaxListNode.next = null;
return minListNode.next;
}
}