链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

这篇具有很好参考价值的文章主要介绍了链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:分析力扣中有关链表的部分题目.

一、链表中倒数第k个结点

题目来源于:牛客网->题目链接

题目描述:

输入一个链表,输出该链表中倒数第k个结点。

示例:

输入:1,{1,2,3,4,5}
返回值:{5}

解题思路:

  1. 创建两个指针:
    ①:返回指针:ret.
    ②:后指针:tail
  2. 后指针(tail),将该指针先走k-1步.
  3. 两个指针同时走,当后指针走向最后一个结点时,ret刚好走到倒数第k个位置.

特殊情况:
pListHead=NULL和K不合法.

链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    if(pListHead==NULL||(k<=0))//如果为空链表或者k是<=0,直接返回NULL
    {
        return NULL;
    }
    struct ListNode*ret=pListHead;
    struct ListNode*tail=pListHead;
    //后指针先走k-1步
    while((--k)&&tail)//细节,k--和--k的区别
    {
        tail=tail->next;
    }
    //k太大
    if (tail == NULL)//如果指向的就是最后一个节点的后的NULL,即k太大
    {
        return NULL;
    }
    //两个指针一起走
    while(tail->next!=NULL)
    {
        tail=tail->next;
        ret=ret->next;
    }
    return ret;
}

二、合并两个有序链表

题目来源于:力扣->题目链接

题目描述:

  将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例1:
输入:

l1 = [1,2,4], l2 = [1,3,4]

输出:

[1,1,2,3,4,4]

链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

解题思路:

  可以创建一个头结点,头结点在链表为空等特殊情况时不需要调整头指针,因为即使链表为空,也还有头结点,只需要将头结点的next置空即可.
步骤:

  1. 创建头结点,并初始化头结点的next为NULL.
  2. 由于头结点的指针域(next)需要作为函数的返回值,所以需要再创建一个指针记录头结点.
  3. 只需要分别比较这两个链表的值,谁小谁尾插到新链表,直到一方为空.
  4. 将此时不为空的链表尾插到新链表.
  5. 返回头结点的next;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    //创建带哨兵卫的结点
    struct ListNode* phead = (struct ListNode*)malloc(sizeof(struct ListNode));
    phead->next = NULL;
    struct ListNode* ret = phead;//保存这个哨兵卫结点
    while (list1 && list2)
    {
        if (list1->val < list2->val)//谁小谁尾插
        {
            phead->next = list1;
            phead = phead->next;
            list1=list1->next;
        }
        else
        {
            phead->next = list2;
            phead = phead->next;
            list2=list2->next;
        }
    }
    //如果一方为空的情况
    if (list1 == NULL)
    {
        phead->next = list2;
    }
    if (list2 == NULL)
    {
        phead->next = list1;
    }
    return ret->next;//哨兵卫结点的next
}

三、分割链表

题目来源于:牛客网->题目链接

题目描述:

  现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

示例:

链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

解题思路:

  1. 创建两个带头结点的单链表.
    ①:SmallHead:用于保存比目标值小的结点.
    ②:BigHead:用于保存比目标值大的结点.

  2. 由于后面要返回新链表,并且小链表的尾巴要与大链表的头链接,综上,上面的两个头结点不能轻易改变,老样子创建两个指针代替它们遍历.
    ①:SmallTail
    ②:BigTail

  3. 遍历原链表,依次与目标值x比较:
    小于目标值x尾插入SmallHead小链表.
    大于等于==目标值x,尾插入BigHead大链表.

  4. 将小链表与大链表链接起来.
    注意:这里需要注意的是大链表(BigHead)的尾结点不一定是原有链表的尾结点,即大链表(BigHead)的尾结点不一定为NULL,我们要手动设置为NULL,否则链表无法结束.

  5. 最后:由于头结点是自己用malloc手动申请的,c语言阶段,需要我们自己手动释放,释放前记得保存要返回的头指针哦.

图解:
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构
特殊情况:
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

代码:

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
    //创建两个链表的头结点
    ListNode* SmallHead=(ListNode*)malloc(sizeof(ListNode));
    ListNode* BigHead=(ListNode*)malloc(sizeof(ListNode));
    //代替两个头结点遍历的指针
    ListNode* SmallTail= SmallHead;
    ListNode* BigTail= BigHead;
    //遍历现有链表
    while(pHead)
    {
        //小的尾插到小的链表中
        if(pHead->val<x)
        {
            SmallTail->next=pHead;
            SmallTail=SmallTail->next;
        }
        else {//大的尾插到大的链表中
            BigTail->next=pHead;
            BigTail=BigTail->next;
        }
        pHead=pHead->next;
    }
    //链接
    SmallTail->next=BigHead->next;
    //大链表的尾结点不一定是NULL,我们要置NULL
    BigTail->next=NULL;
    //保留要返回的头指针
    pHead=SmallHead->next;
    //释放自己动态内存申请的空间
    free(SmallHead);
    free(BigHead);
    return pHead;
    }
};

四、链表的回文结构

题目来源于:牛客网->题目链接

题目描述:

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构(从前往后,和从后往前遍历结果一样)。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

示例1:
输入:

1->2->2->1

输出;

true

示例2:

输入:

1->2->3->2->1

输出:

true

解题思路:

将链表的后半段逆序,然后与前半段一次比较,都一样则是回文结构,不一样则不是回文结构.

  1. 寻找中间结点,前面牛牛讲过方法哦,快慢指针就行.
  2. 从中间结点开始,反转原链表的后半段.
  3. 比较链表的前半段与后半段:
    不相同:则返回false
    相同:则返回true

链表中间结点与链表逆置在这篇文章->传送门

图解:
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构

代码:

class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
       //寻找中间结点
        ListNode* mid=middleNode(A);
        //反转链表后半段
        ListNode* B=reverseList(mid);
        //比较
        while(A&&B)
        {
            if(A->val!=B->val)
            {
                return false;
            }
            A=A->next;
            B=B->next;
        }
        return true;
    }
};

本文主要记录牛牛学习链表时刷题记录,希望这篇文章对大家有帮助。欢迎小伙伴们私信提意见和提问哦!
最后,小伙伴们的点赞就是给牛牛最大的支持,能不能给牛牛来一个一键三连呢?谢谢支持。
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构
文章来源地址https://www.toymoban.com/news/detail-498795.html

到了这里,关于链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Leetcode刷题】链表的中间结点和合并两个有序链表

    生命如同寓言,其价值不在与长短,而在与内容。                                ——塞涅卡 目录 一.链表的中间结点 1.快慢指针 二.合并两个有序链表  1.尾插法 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点

    2023年04月17日
    浏览(45)
  • 反转链表、链表的中间结点、合并两个有序链表【LeetCode刷题日志】

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 这里解释一下三个指针的作用: n1:记录上一个节点,如果是第一个就指向空 n2:记录此节点的位置 n3:记录下一个节点的位置,让翻转后能找到下一个节点

    2024年02月03日
    浏览(50)
  • day4 两两交换链表中的节点 删除链表的倒数第N个节点 链表相交 环形链表

    - 两两交换链表中的节点     - cur移动的时候,应该后移动俩位,或者说移动到下一操作节点的前一位 - 删除链表的倒数第N个节点      - 因为slow删除元素是要在删除元素的前一位进行删除,所以while ( k--) 移动的fast还不够,还需要再往后移动一位,这样才能让slow指向正确

    2024年02月16日
    浏览(39)
  • 【力扣-JZ22】链表中倒数第k个结点

    🖊作者 : Djx_hmbb 📘专栏 : 数据结构 😆今日分享 : \\\"把手插进米堆的原因 \\\" : 因为米堆类似于高密度的流体,会给人的手带来较大的压强,这种压强促进静脉血回流,会让人感到生理上的舒服。 【力扣-JZ22】 : 先计算链表有多长,然后length–,找到第k个指针 : fast指针先走k步,然后

    2024年02月01日
    浏览(65)
  • 24. 两两交换链表中的节点&19.删除链表的倒数第N个节点 &160.链表相交&142.环形链表II

    24. 两两交换链表中的节点: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。   19.删除链表的倒数第N个节点  给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的

    2024年02月15日
    浏览(40)
  • 【数据结构OJ题】链表中倒数第k个结点

    原题链接:https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13tqId=11167rp=2ru=/activity/ojqru=/ta/coding-interviews/question-ranking 目录 1. 题目描述 2. 思路分析 3. 代码实现 快慢指针法   (如果有小伙伴不了解快慢指针法,可以看看这篇文章:https://blog.csdn.net/m0_62531913/article/details/

    2024年02月12日
    浏览(50)
  • HJ51 输出单向链表中倒数第k个结点

    写在前面: 做题环境如下: 题目渠道:牛客网 HJ51 输出单向链表中倒数第k个结点 华为机试题 编程语言:C++ 描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。 链表结点定义如下: 正常返回倒数第k个结点指针,异常返回空指针

    2024年02月02日
    浏览(42)
  • Day4|LeetCode 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、160.链表相交、142.环形链表

    LeetCode 24. 两两交换链表中的节点 题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode) 视频链接:帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点_哔哩哔哩_bilibili 思路 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节

    2024年02月16日
    浏览(56)
  • Leetcodes刷题之删除链表的倒数N个结点和删除链表的中间的结点

    吾心信其可行,则移山填海之难,终有成功之日。                           --孙中山 目录 🍉一.删除链表的倒数N个结点 🌻1.双指针 🍁2.求链表的长度 🌸二.删除链表的中间的结点 给你一个链表,删除链表的倒数第  n   个结点,并且返回链表的头结点。 示例 1: 示例

    2024年02月01日
    浏览(70)
  • 【Leetcode60天带刷】day04链表——24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交

    Leetcode原题链接: 24. 两两交换链表中的节点  给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 示例 2: 示例 3: 提示: 链表中节点的数目在范围  [0, 100]  内 0 =

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包