- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
86. 分隔链表
-
给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。
-
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入:head = 1->4->3->2->5->2, x = 3
输出:1->2->2->4->3->5
复制代码
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa…
思路
- 首先根据题目判断题目的类别
- 明显就是普通遍历链表的思路
- 但是值得注意的是题目中提到的是要注意,原链表元素的相对顺序不能改变
- 那么我们在遍历的时候,如果只使用一个
哑结点
可能是不能实现的 - 重新理解题意是小于
x
的元素节点都是在前面 - 大于等于
x
的元素节点都在后面 - 那么根据上面梳理的思路就是创建两个
哑结点
- 一个链保存小于
x
的元素,另一个链保存大于等于x
的元素 - 最后将小于
x
的元素指向大于等于x
的元素
- 那么我们在遍历的时候,如果只使用一个
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode small = new ListNode(0); //创建哑节点
ListNode smallHead = small;
ListNode large = new ListNode(0); //创建哑节点
ListNode largeHead = large;
while(head != null){
if(head.val < x){
small.next = head;
small = small.next;
}else{
large.next = head;
large = large.next;
}
head = head.next;
}
large.next = null; //将最后一个元素的下一个元素赋为空,"封死路口"
small.next = largeHead.next; //将小值链表 与大值链表 连接;
return smallHead.next;
}
}
复制代码