哈喽,小伙伴们,大家好。本篇文章将会带大家刷一些题目,温馨提示:本篇文章内容可能会很无聊,但也希望好学的你耐心看完。
首先,我们来一道开胃小菜。
例题一:
题目要求:
返回中间节点
思路:
我们可以定义两个指针,并且设置为一个走一步,另一个走两步,让双指针遍历链表,当一个指针跳出循环时返回走一步的那个指针。
相信大家应该从图片的中已经猜到这是什么方法了吧,没错它就是快慢指针法(其实只是双指针用法的一种)
也许会有人问,上面这个例子的节点个数是奇数,如果是节点个数是偶数咋整嘞?
嘿,我就知道好学的你一定会这么问,请看下面。
像这个例子就是偶数个节点了,那么这种偶数个节点的写法和奇数个节点的写法一样, 此时偶数个节点的链表会有两个中间节点,我们只需要返回第二个节点即可。
源代码:
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;
图解补充
今天的内容就先到这,喜欢我的朋友可以给我点个关注,我们下次再见。