题目描述
给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
题目链接: link.
解题思路
此处我们从链表头开始遍历,如果当前节点的值小于x我们就将x节点拿出来接到新的一个min_head的链表的末尾,用于专门存放小于x值的链表,由于是依次存放所以也并不改变节点顺序,最后将删除了了小于x值的链表接到min_head链表的末尾,就得到了对应的链表。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
if(head==null || head.next==null){
return head;
}
ListNode temp_head=new ListNode(0);
ListNode temp_minhead=new ListNode(0);
temp_head.next=head;
ListNode p=head;
ListNode pre=temp_head;
ListNode minhead=temp_minhead;
while (p!=null){
if(p.val<x){
//删除当前遍历到的节点
pre.next=p.next;
p.next=null;
//添加到最小值的节点
minhead.next = p;
minhead=minhead.next;
//更新p
p=pre.next;
}else {
pre=pre.next;
p=p.next;
}
}
minhead.next=temp_head.next;
return temp_minhead.next;
}
}