链表
分隔链表
https://leetcode-cn.com/problems/partition-list/
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
思想
需要使用5个临时节点,分别指向
- 小于链表的头
- 小于链表的next指针 A
- 大于链表的头 BB
- 大于链表的next指针 B
- 当前链表的遍历节点 C
遍历当前链表如果节点的值小于给定的值,那么将小于节点的next指针指向改节点,同时C下移,A=A.next。反之亦然
注意点
- 小于节点的最后一个节点指向大于节点的头的下一个节点也就是BB.next
- 大于节点的最后一个节点的next指向null。防止形成链表的循环
- 返回值为 小于节点头的下一节点
代码实现
package com.vitamin.list;
import java.util.List;
/**
* @author vitamin
* 2022/4/7 12:26
*/
public class Partition {
public ListNode partition(ListNode head, int x) {
ListNode dummyNodeMin = new ListNode(-1, null);
ListNode dummyNodeMax = new ListNode(-1, null);
ListNode currentNodeLeft = dummyNodeMin;
ListNode currentNodeRight = dummyNodeMax;
ListNode currentNode = head;
while (currentNode != null) {
if (currentNode.val < x) {
currentNodeLeft.next = currentNode;
currentNodeLeft = currentNodeLeft.next;
} else {
currentNodeRight.next = currentNode;
currentNodeRight = currentNodeRight.next;
}
currentNode = currentNode.next;
}
currentNodeLeft.next = dummyNodeMax.next;
currentNodeRight.next = null;
return dummyNodeMin.next;
}
}