题目:
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你不需要 保留 每个分区中各节点的初始相对位置。
思路:
创建两个新的子链表,其中它们的节点由原链表构成。
一个链表存放所有大于val的值,零、另一个链表存放所有小于val的值,小于val 的节点的尾节点拼接大于val的链表的头节点即可。
动态图解:
public ListNode partition(ListNode head, int x) {
if (head == null || head.next == null) {
return head;
}
ListNode smallHead = new ListNode();
ListNode smallTail = smallHead;
ListNode bigHead = new ListNode();
ListNode bigTail = bigHead;
// 扫描原链表
while (head != null) {
if (head.val < x) {
smallTail.next = head;
smallTail = head;
}else {
bigTail.next = head;
bigTail = head;
}
head = head.next;
}
// 大链表的末尾断掉
bigTail.next = null;
// 拼接小链表与大链表
smallTail.next = bigHead.next;
return smallHead.next;
}