算法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. 画图很关键!!
相关推荐
古城小栈4 小时前
为啥说:训练用BF16,推理用FP16
人工智能·算法·机器学习
KaMeidebaby4 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
Turbo正则5 小时前
群论在AI中的应用概述
人工智能·算法·抽象代数
ysa0510305 小时前
【并查集】判环
c++·笔记·算法
Jerry5 小时前
KeetCode 44. 开发商购买土地
算法
Jerry5 小时前
KeetCode 58. 区间和
算法
Jerry6 小时前
LeetCode 209. 长度最小的子数组
算法
彦为君7 小时前
算法思维与经典智力题
java·前端·redis·算法
智能优化与强化学习7 小时前
Gym(Gymnasium)仿真环境详解(二):环境简介、入门算法、调参要点、核心挑战
算法·强化学习·gym·零基础入门·算法评估
mxwin7 小时前
Unity Shader exp 函数的算法与渲染应用
算法·unity·游戏引擎·shader