难度:中等
题目:
给你一个链表的头节点
head
和一个特定值x
,请你对链表进行分隔,使得所有 小于x
的节点都出现在 大于或等于x
的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。
示例一:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例二:
输入:head = [2,1], x = 2
输出:[1,2]
提示:
- 链表中节点的数目在范围
[0, 200]
内 -100 <= Node.val <= 100
-200 <= x <= 200
Related Topics
- 链表
- 双指针
重点!!!———解题思路
第一步:
由于我们是要分隔链表,是根据一个数的大小来分隔的,
那我们肯定需要建立两个链表,
让大于这个给定的数的节点连接在第一个链表后面,
让小于这个给定的数的节点连接在第二个链表的后面。
第二步:
然后我们让第一个链表的最后一个节点的下一个节点指向第二个链表的头节点,
将分隔之后的两个链表连接成为一个链表
最后返回第一个链表的头节点,即答案
源码:
class Solution {
public ListNode partition(ListNode head, int x) {
if (head==null) return null;
ListNode h1 = new ListNode(-1),h2=new ListNode(-1); //创建两个链表
ListNode p1=h1,p2=h2; //创建两个节点分别指定两个链表的前驱节点
for (ListNode p=head,q;p!=null;p=q){ //建立一个用来遍历的指针p ,q指针用来让p往后走
q=p.next; //记录一下p的下一个节点
p.next=null; //把这个p点分离出来成为一个单独的节点
if (p.val<x){ //判断p节点和给定数的大小
p1.next=p;
p1=p;
}else {
p2.next=p;
p2=p;
}
p1.next=h2.next; //让h1链表的尾节点指向h2链表的头节点
}
return h1.next;
}
}
运行结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧