单链表算法 - 链表分割

链表分割_牛客题霸_牛客网现有一链表的头指针 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;
    }
};

提交结果:

相关推荐
XH华4 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生5 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_5 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子5 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
菜鸡中的奋斗鸡→挣扎鸡5 小时前
滑动窗口 + 算法复习
数据结构·算法
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码5 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
scan7246 小时前
LILAC采样算法
人工智能·算法·机器学习
菌菌的快乐生活6 小时前
理解支持向量机
算法·机器学习·支持向量机
大山同学6 小时前
第三章线性判别函数(二)
线性代数·算法·机器学习