牛客网---CM11 链表分割 代码详解+哨兵位的比较

简介: 刷题

前言


独处未必孤独喜欢就是自由

本章的内容是牛客网随机一题的部分方法的解析

提示:以下是本篇文章正文内容,下面案例可供参考

CM11 链表分割


链接:

CM11 链表分割link

方法一:尾插(带哨兵位)


1.1 思路:


把小于x的尾插第一个链表,大于x的尾插第二个链表,最后链接在一起

1.2 代码:


class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) 
    {
        struct ListNode* lesshead,*lesstail,*greaterhead,*greatertail;
        lesshead=lesstail=(struct ListNode*)malloc(sizeof(struct ListNode));
        greaterhead=greatertail=(struct ListNode*)malloc(sizeof(struct ListNode));
        struct ListNode* cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
                lesstail->next=cur;
                lesstail=lesstail->next;
            }
            else 
            {
                greatertail->next=cur;
                greatertail=greatertail->next;
            }
            cur=cur->next;
        }
        lesstail->next=greaterhead->next;
        greatertail->next=NULL;
        pHead=lesshead->next;
        free(lesshead);
        free(greaterhead);
        return pHead;
    }
};

1.3 流程图


1.4 注意点


易错点一: lesstail->next=greaterhead->next

这是带哨兵位的链表,所以应该是 lesstail->next=greaterhead->next;而不应该是 lesstail=greaterhead;

易错点二:末尾要置空否则造成循环链表greatertail->next=NULL;

一定要加上greatertail->next=NULL;不然当出现一个链表中既有大于x又有小于x的时候(例如上述流程图7的next指向的还是2如果不置空就会造成循环)

方法二:尾插(不带哨兵位)


2.1代码:


class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) 
    {
        struct ListNode* lesshead,*lesstail,*greaterhead,*greatertail;
        lesshead=lesstail=NULL;
        greaterhead=greatertail=NULL;
        struct ListNode* cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
                if(lesstail==NULL)
                {
                    lesstail=lesshead=cur;
                }
                else 
                {
                    lesstail->next=cur;
                    lesstail=lesstail->next;
                }
            }
            else 
            {
                if(greatertail==NULL)
                {
                    greatertail=greaterhead=cur;
                }
                else 
                {
                    greatertail->next=cur;
                    greatertail=greatertail->next;
                }
            }
            cur=cur->next;
        }
        if(lesstail==NULL)
        {
            return greaterhead;
        }
        else 
        {
             lesstail->next=greaterhead;
        }       
        if(greatertail!=NULL)
        {
            greatertail->next=NULL;
        }
        pHead=lesshead;
        return pHead;
    }
};

对比:


对比方法一和方法二,很明显带哨兵位可以优化代码减少判断的次数不用考虑头节点是否为空的情况

总结

Ending,今天的内容就到此结束啦,如果后续想了解更多,就请关注我吧

相关文章
|
6月前
|
存储 编译器 C语言
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
59 0
|
1月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
28 0
|
2月前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
3月前
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
【数据结构】双向带头(哨兵位)循环链表 —详细讲解(赋源码)
91 4
|
4月前
【数据结构OJ题】链表分割
牛客题目——链表分割
32 0
【数据结构OJ题】链表分割
|
5月前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
6月前
|
算法
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
|
5月前
最复杂的链表(带哨兵位的双向循环链表)
最复杂的链表(带哨兵位的双向循环链表)
【每日一题】牛客网——链表分割
【每日一题】牛客网——链表分割
|
6月前
牛客—CM11 链表分割
牛客—CM11 链表分割