算法3:链表分割

题目链接

解析:

完整代码:

cpp 复制代码
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstddef>
#include <unistd.h>
class Partition {
  public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        ListNode* lessHead,*lessTail;
        lessHead = lessTail =(ListNode*)malloc(sizeof(ListNode));
        ListNode* greaterHead,*greaterTail;
        greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));
        ListNode* pcur = pHead;
        while(pcur)
        {
            if(pcur->val < x)
            {
                //插入小链表
                lessTail->next = pcur;
                lessTail = lessTail->next;
            }
            else 
            {
                greaterTail->next = pcur;
                greaterTail = greaterTail->next;
                //插入大链表
            }
            pcur = pcur->next;
        }
        //跳出循环,链表遍历完,将大小链表相连
        lessTail->next = greaterHead->next;
        //将大链表的尾节点置为空,防止死循环
        greaterTail->next = NULL;
        //先保存要用的结点,再释放申请的两个哨兵位,并置为空,防止野指针
        ListNode* retHead = lessHead ->next;
        free(lessHead);
        free(greaterHead);
        lessHead = greaterHead = NULL;
        return retHead;

    }
};

有许多小细节需要注意:

  1. 申请结点的释放并置为空指针,防止野指针!!
  2. 多用几组测试案例去测试,这样考虑的更加全面,代码也更加完善!!
  3. 画图很关键!!
相关推荐
hanlin034 小时前
刷题笔记:力扣第32题-最长有效括号
笔记·算法·leetcode
All for pursuit.5 小时前
【动态规划-21】312.戳气球
数据结构·c++·算法·leetcode·动态规划
碧海银沙音频科技研究院7 小时前
基于炬芯ATS3089X自研AEC声学回声消除算法
算法
通问AI7 小时前
在两台 Mac Studio 上跑 800B 模型:MLX + RDMA over Thunderbolt 实测与四道门选型法
算法
ZywOo6237 小时前
《算法竞赛进阶指南》0x03 前缀和与差分
算法
Scintilla_y8 小时前
DAY2 滑动窗口
算法·leetcode·散列表
lvwangshu8 小时前
笛卡尔树
算法·图论
026d238 小时前
状态信号只知“其然”不知“其所以然”:变工况机械故障诊断的物理盲区
算法
姜鱼问生8 小时前
备份和服务器在同一台机器上,等于没备份
算法·架构
姜鱼问生8 小时前
别再 chmod 777 了,用 ACL 给它开一扇窗
后端·算法·架构