「这是我参与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 -> 3next指向第四元素,因为2 < 3,将节点加入newHead,此时newHead:0 -> 1 -> 2next指向第五元素,因为5 > 3,将节点加入newTail,此时newTail:0 -> 4 -> 3 -> 5next指向第六元素,因为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);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~