「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」
前言
力扣第八十六题 分隔链表
如下所示:
给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
输入: head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
一、思路
这一题我刚开始想的是只需要一个 空链表 就可以了,将那些大于等于目标值移动到空链表中。后来写了很久才发现,如果链表一开始的节点的值就需要移动到空链表中,就无法正常的更新整个原先的链表了。
举个例子:当
head = [1, 2, 3], x = 2
时,你无法讲原链表的指针指向最后一个节点3
于是,我就是用了两个 空链表,一个用来存储 大于等于目标值的节点
,另一个用来存储 小于目标值的节点
实现起来还是比较容易的,大致的步骤如下:
- 初始化两个空链表
newHead
和newTail
,分别表示新链表的前面部分和后面的部分。 - 使用指针
next
开始遍历链表head
- 只要
next.val >= target
就将next
节点加入链表newTail
- 只要
next.val < target
就将next
节点加入链表newHead
- 拼接结果,将
newHeadCurrent.next = newTail.next
(newHeadCurrent
为链表的最后一个节点),然后返回newHead.next
即可
注意:因为新建的两个链表的首节点都是无用的,所以在拼接结果时,要记得讲这两个首节点丢弃掉
举个例子
此处以实例中的 head = [1,4,3,2,5,2], x = 3
作为例子
next
指向第一个元素,因为1 < 3
,将节点加入newHead
,此时newHead:0 -> 1
(新链表首节点为 0)next
指向第二元素,因为4 > 3
,将节点加入newTail
,此时newTail:0 -> 4
(新链表首节点为 0)next
指向第三元素,因为3 == 3
,将节点加入newTail
,此时newTail:0 -> 4 -> 3
next
指向第四元素,因为2 < 3
,将节点加入newHead
,此时newHead:0 -> 1 -> 2
next
指向第五元素,因为5 > 3
,将节点加入newTail
,此时newTail:0 -> 4 -> 3 -> 5
next
指向第六元素,因为2 < 3
,将节点加入newHead
,此时newHead:0 -> 1 -> 2 -> 2
- 拼接结果
newHeadCurrent.next = newTail.next
,此时newHead:0 -> 1 -> 2 -> 2 -> 4 -> 3 -> 5
- 返回
newHead.next
,即:newHead:1 -> 2 -> 2 -> 4 -> 3 -> 5
二、实现
实现代码
实现代码与思路中保持一直
public ListNode partition(ListNode head, int x) {
// 大于目标值的头节点
ListNode tailHead = new ListNode();
ListNode tailHeadCurrent = tailHead;
ListNode newHead = new ListNode();
ListNode newHeadCurrent = newHead;
ListNode next = head;
while (next != null) {
if (next.val >= x) {
// 只要next的值大于或等于目标值,就加入新的头节点
while (next != null && next.val >= x) {
tailHeadCurrent.next = next;
tailHeadCurrent = tailHeadCurrent.next;
next = next.next;
}
} else {
newHeadCurrent.next = next;
newHeadCurrent = newHeadCurrent.next;
next = next.next;
}
}
tailHeadCurrent.next = null;
newHeadCurrent.next = null;
newHeadCurrent.next = tailHead.next;
return newHead.next;
}
测试代码
public static void main(String[] args) {
ListNode listNode = new ListNode(1, new ListNode(4, new ListNode(3, new ListNode(2, new ListNode(5, new ListNode(2 ))))));
ListNode listNode1 = new ListNode(2, new ListNode(4));
new Number86().partition(listNode, 3);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~