单链表算法 - 链表分割

链表分割_牛客题霸_牛客网现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的。题目来自【牛客题霸】https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70思路:

代码:

cpp 复制代码
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        //创建两个非空链表:小链表和大链表
        ListNode* lesstHead,*lesstTail;
        lesstHead = lesstTail = (ListNode*)malloc(sizeof(ListNode));

        ListNode* greaterHead,*greaterTail;
        greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));
        //创建临时变量来遍历原数组
        ListNode* prev = pHead;
        while(prev)
        {
            //判断当前节点是否小于x
            if(prev->val < x)
            {
                //插入到小链表中
                lesstTail->next = prev;
                lesstTail = lesstTail->next;
            }
            else
            {
                //插入到大链表中
                greaterTail->next = prev;
                greaterTail = greaterTail->next;
            }
            prev = prev->next;
        }
        //退出循环原链表遍历完成
        //连接两个链表
        lesstTail->next = greaterHead->next;
        ListNode* ret = lesstHead->next;
        free(lesstHead);
        lesstHead = NULL;
        free(greaterHead);
        greaterHead = NULL;
        return ret;
    }
};

提交结果:

当我们提交代码之后代码有问题,那么代码到底哪里的逻辑不合适呢?我们画图看一下。

cpp 复制代码
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        //创建两个非空链表:小链表和大链表
        ListNode* lesstHead,*lesstTail;
        lesstHead = lesstTail = (ListNode*)malloc(sizeof(ListNode));

        ListNode* greaterHead,*greaterTail;
        greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));
        //创建临时变量来遍历原数组
        ListNode* prev = pHead;
        while(prev)
        {
            //判断当前节点是否小于x
            if(prev->val < x)
            {
                //插入到小链表中
                lesstTail->next = prev;
                lesstTail = lesstTail->next;
            }
            else
            {
                //插入到大链表中
                greaterTail->next = prev;
                greaterTail = greaterTail->next;
            }
            prev = prev->next;
        }
        //将大链表的尾节点的next指针置为NULL
        greaterTail->next = NULL;
        //连接两个链表
        lesstTail->next = greaterHead->next;
        ListNode* ret = lesstHead->next;
        free(lesstHead);
        lesstHead = NULL;
        free(greaterHead);
        greaterHead = NULL;
        return ret;
    }
};

提交结果:

相关推荐
城管不管13 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
月疯14 小时前
二分法算法(水平等分图形面积)
算法
豆瓣鸡14 小时前
算法日记 - Day3
java·开发语言·算法
白白白小纯14 小时前
算法篇—反转链表
c语言·数据结构·算法·leetcode
Achou.Wang14 小时前
深入理解go语言-第5章 并发编程——Go的灵魂
大数据·算法·golang
The Chosen One98514 小时前
高进度算法模板速记(待完善)
java·前端·算法
小羊先生car15 小时前
RTOS-F429-HAL-绝对延时和相对延时(2026/7/31)
c语言·rtos
土豆.exe17 小时前
Fastjson2 2.0.53 哈希碰撞 RCE:从原理到三种打法
算法·哈希算法
黄河123长江17 小时前
有限Abel群的结构()
算法
阿米亚波17 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl