正如标题所说,本文会图文详细解析三道单链表OJ题,分别为:
把他们放在一起讲的原因是: 反转链表 和 链表的中间节点 是 链表的回文结构 的基础
为什么这样说?请往下看:
目录
1. 反转链表
做题思路
画图理解
代码实现
2. 链表的中间节点
做题思路
画图理解
代码实现
3. 链表的回文结构
做题思路
画图理解
代码实现
LeetCode链接:206. 反转链表 - 力扣(LeetCode)
这里需要3个指针:
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* cur = head;
struct ListNode* prev = NULL;
while (cur != NULL)
{
struct ListNode* next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;
}
最后提交代码试试:
完美通过,本题并不难,来搞下一题
LeetCode链接:876. 链表的中间结点 - 力扣(LeetCode)
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* slow = head;
struct ListNode* fast = head;
while (fast != NULL && fast->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
提交代码:
这道题也很简单,主要就是快慢指针的思路,第一次接触的话可能想不到这种方法
接下来就是本文重点了,前面这些只是开胃小菜
牛客链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com)
1. 找到中间节点
2. 反转中间节点及其之后的链表
3. 此时把链表分为两段:
4. 比较 list1 和 list2 节点的值是否相等
5. 当 list2 走到 NULL 处时,说明此链表是回文结构,返回 true
可以看到本题需要调用之前写过的代码
这就是为什么我说前两道题是本题的基础
//找链表的中间节点
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* slow = head;
struct ListNode* fast = head;
while (fast != NULL && fast->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
//反转链表
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* cur = head;
struct ListNode* prev = NULL;
while (cur != NULL)
{
struct ListNode* next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;
}
//牛客这道题不支持用C语言答题
//虽然我们还没有学C++,但是C++是兼容C的
//直接用C的方式写代码即可
class PalindromeList
{
public:
bool chkPalindrome(ListNode* head)
{
struct ListNode* list1 = head;
struct ListNode* mid = middleNode(head);
struct ListNode* list2 = reverseList(mid);
while (list2 != NULL)
{
if (list1->val != list2->val)
{
return false;
}
list1 = list1->next;
list2 = list2->next;
}
return true;
}
};
提交代码:
成功通过
怎么样,大家看到这里把这三道题弄懂了吗?如果有问题可以在评论区留言哦 :D
本文完