LeetCode86. 分隔链表
题目说明
/**
*
* 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,
* 使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
* <p>
* 你应当 保留 两个分区中每个节点的初始相对位置。
*
*/
思路分析
- 题目要求将给定链表按一特定值分隔开,使得前半部分节点的值小于这一特定值,后半部分的值大于等于特定值
- 可以再定义两个节点,重新构建两条链表,一条链表用于连接比特定值小的节点,而另一链表用于连接比特定值大的链表
- 那么只需要对原始链表进行一次遍历,每次判断当前节点的值和特定值的大小关系,然后将其节点连接到不同的链表上
- 遍历结束后,已然形成两条链表,然后将这两条链表连接起来即可
- 注意链表的链式存储结构,一个节点可能还包含其他节点的引用,即一个节点可能还连接着其他节点,在某些情况下需要置空
- 源码见下
源码及分析
/**
*
* @param head 链表头节点
* @param x 特定值x
* @return 返回处理后的链表
*/
public ListNode partition(ListNode head, int x) {
//如果头节点为空或者只有一个节点,直接返回本身
if (head == null || head.next == null) {
return head;
}
//创建两条链表,一条用于存储比x值小的节点,一条用于存储比x值大的节点
ListNode smallDummy = new ListNode();
ListNode bigDummy = new ListNode();
//创建辅助指针用于构建两条链表
ListNode cur1 = smallDummy;
ListNode cur2 = bigDummy;
//遍历原始链表
while (head != null){
//如果当前位置head的值小于x,将当前节点连接到smallDummy
if (head.val < x){
cur1.next = head;
cur1 = cur1.next;
}else {
//否则将当前节点连接到bigDummy
cur2.next = head;
cur2 = cur2.next;
}
//head后移
head = head.next;
}
//将cur2指针后边置空,因为后边可能还连接着其他节点
//注意链表的链式存储机制
cur2.next = null;
//将两条链表连接起来
cur1.next = bigDummy.next;
return smallDummy.next;
}