算法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. 画图很关键!!
相关推荐
菜鸡爱玩1 小时前
线性代数矩阵相乘
线性代数·算法·矩阵
devilnumber5 小时前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
‎ദ്ദിᵔ.˛.ᵔ₎7 小时前
双指针、滑动窗口、前缀和、二分查找 算法
算法
顾北顾7 小时前
多头注意力机制
人工智能·深度学习·算法
H178535090967 小时前
SolidWorks_基于草图的实体特征20_特征错误排查
算法·3d建模·solidworks
hujinyuan201607 小时前
2025年12月中国电子学会青少年机器人技术等级考试试卷(二级) 真题+答案
人工智能·算法·机器人
bIo7lyA8v8 小时前
算法复杂度评估的实验统计方法与可视化的技术8
算法
李老师讲编程9 小时前
中国电子学会图形化2020.12月Scratch三级考级题
算法·scratch·信息学奥赛·图形化编程·scratch素材
退休倒计时9 小时前
【每日一题】LeetCode 53. 最大子数组和 TypeScript
数据结构·算法·leetcode·typescript