算法012(入门)——划分链表

分隔链表

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

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

思路:

三指针:一个(front)记录val大于等于x的链表部分的头结点,另一个(back)记录val大于等于x的链表部分的尾结点,一个(pre)记录头结点之前的节点

大体流程:

  • 遍历list:遇到大于等于x的node,插入到尾节点并更新尾节点;遇到小于x的node,插入到头结点前并更新pre

代码:

 

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        if (!head || !head->next)
            return head;
        ListNode *front=nullptr, *back=nullptr, *pre = new ListNode(0), *tmp;
        ListNode* ret = pre;
        while (head) {
            tmp = head->next;
            if (head->val >= x) {
                if (!front) {
                    front = back = head;
                } else {
                    back->next = head;
                    back = head;
                }
            } else {
                if (back) {
                    back->next = tmp;
                    head->next = front;
                    pre->next = head;
                    pre = head;
                } else {
                    pre->next = head;
                    pre = head;
                }
            }
            head = tmp;
        }
        if(!pre->next){
            pre->next=front;
        }
        tmp=ret->next;
        delete ret;
        ret=tmp;
        return ret;
    }
};

注:

  • 注意front和back的初始化,应该在首次遇到≥x的node时进行初始化
  • 注意数据的极端化,可能先遇到≥x的,利用哨兵卫pre可以解决;可能全无<x的,需要特判
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值