LeetCode-86.分割链表(相关话题:双指针)

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

解题思路:工作指针p和q,p指向已经分隔好的小于特定值x的最后一个节点,q指向当前正在处理的节点的前一个节点(如果节点i的值小于x,需要将节点摘掉链到p的后面,需要节点i的前一个节点,因此q指向当前正在处理节点的前一个节点)

另外,为了方便处理当前头节点(因为q要指向正在处理节点的前一节点),new一个工作节点p指向头节点(p.next = head;head = p),从q = head开始处理

Java代码:

class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode p = new ListNode(0x3f3f3f3f), tmp = null;
        ListNode q = p;
        p.next = head;
        head = p;
        while(null != q && null != q.next){
            if(q.next.val < x){
                if(q == p) {
                    p = p.next;
                    q = q.next;
                } else {
                    tmp = q.next;
                    q.next = q.next.next;
                    tmp.next = p.next;
                    p.next = tmp;
                    p = p.next;
                }
            } else {
                q = q.next;
            }
        }
        return head.next;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38823568/article/details/82747910
今日推荐