最近在速刷算法题:刷题链接如下点击
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode partition(ListNode head, int x) {// if(head == null) return null;ListNode phead = new ListNode(-1,head), p = phead;ListNode px = null,max_pre = null;//找到第一个大于x的前置节点,若没有就是找到x的前置节点while(p.next != null){if(p.next.val >= x){max_pre = p;break;}p = p.next;}if(max_pre == null) return head;px = max_pre.next;//从此节点后一个节点开始寻找小于它的节点ListNode ppx = px.next,pre = px;while(ppx != null){ListNode q = ppx.next;//保证相对位置,就得在max_pre结点后进行尾插法if(ppx.val < x){max_pre.next = ppx;ppx.next = px;max_pre = max_pre.next;pre.next = q;ppx = q;}else{//若不符合要求,继续后移,同时记录前置节点pre = pre.next;ppx = ppx.next;}}return phead.next;}
}