关于链表的一些例题

哈喽,小伙伴们,大家好。本篇文章将会带大家刷一些题目,温馨提示:本篇文章内容可能会很无聊,但也希望好学的你耐心看完。

首先,我们来一道开胃小菜。

例题一:

题目要求:

返回中间节点

思路:

我们可以定义两个指针,并且设置为一个走一步,另一个走两步,让双指针遍历链表,当一个指针跳出循环时返回走一步的那个指针。

相信大家应该从图片的中已经猜到这是什么方法了吧,没错它就是快慢指针法(其实只是双指针用法的一种)

也许会有人问,上面这个例子的节点个数是奇数,如果是节点个数是偶数咋整嘞?

嘿,我就知道好学的你一定会这么问,请看下面。

像这个例子就是偶数个节点了,那么这种偶数个节点的写法和奇数个节点的写法一样, 此时偶数个节点的链表会有两个中间节点,我们只需要返回第二个节点即可。

源代码:

 typedef struct ListNode ln;

struct ListNode* middleNode(struct ListNode* head) {

    ln* slow, *fast;

    slow = head;

    fast = head;

    while(fast && fast->next)

    {

       slow = slow->next;

       fast = fast->next->next;

    }

    return slow;

}

那么这一题就给大家讲到这,我们进入下一题的讲解。

例题二:

题目要求

将链表进行反转

思路

链表反转思路讲解

源代码

 typedef struct ListNode ln;

struct ListNode* reverseList(struct ListNode* head) {

    ln* n1,* n2,* n3;

    if(head == NULL)

    {

        return head;

    }

    n1 = NULL;

    n2 = head;

    n3 = n2->next;

    while(n2)

    {

        n2->next = n1;

        n1 = n2;

        n2 = n3;

        if(n3)

        {

            n3 = n3->next;

        }

    }

    return n1;

}

例题三

题目要求

判断是否是回文结构

如果是第一次做这个题的小伙伴应该会很迷惑回文结构是什么鬼?不知道没关系,我们先来了解一下

部分一:

回文结构的概念

总结:回文结构是结构相同,方向相反

那么我们需要分两种情况讨论:

第一种情况:链表个数是奇数

那么除中间节点外,我们只需要保持左右对称,并且中间节点的左右两侧方向相反即可

第二种情况:链表个数是偶数

我们需要保持左右对称,并且中间节点的左右两侧方向相反

总结:为了确保能让两侧结构相同且方向相反,我们需要使用例题一的思路来判断所给的例子是否是奇数个节点

第一部分的源代码

见例题一

上面的部分搞定后,我们是不是需要判断是否符合结构相同呀,那么,如何判断呢?

部分二

思路

判断两侧数字是否相等即可

这里也许会有小伙伴说这不是很简单吗,用一下双指针直接完事了。但是小伙伴(有这种想法),你要注意了,这是道链表题呀,可不能胡来。

方法:先将右侧的节点逆序,然后判断是否相等即可

第二部分的源代码

见例题二

终于来到我们的第三部分了

部分三

思路

使用双指针遍历链表进行判断是否相等

第三部分源代码

 //将从中间节点到末尾的节点逆置(还不懂看下面补充的图)

       while(rmid && A)

       {

        if(rmid->val != A->val)

        return  false;

        rmid = rmid->next;

        A = A->next;

       }

       return true;

图解补充


今天的内容就先到这,喜欢我的朋友可以给我点个关注,我们下次再见。

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值