目录
前言
一.思路
1)用指针遍历链表,创建 count 计数,返回 count/2->next 即为中间节点
2)快慢指针
二.代码实现
1)思路一
2)思路二
搭配食用更佳哦~~
数据结构之单单单——链表-CSDN博客
数据结构之单链表的基本操作-CSDN博客
前面学了单链表的相关知识,我们来尝试做一下关于顺序表的经典算法题~
前言
链表的中间节点同样也是力扣上一道简单题,适合刚学过单链表的我们更好的理解链表相关知识~当然最好大家可以先去力扣上自己 try 一下~~
876. 链表的中间结点 - 力扣(LeetCode)https://leetcode.cn/problems/middle-of-the-linked-list/description/
一.思路
题目中的两个示例的两种不同情况其实就是两种:奇数节点链表和偶数节点链表。
1)用指针遍历链表,创建 count 计数,返回 count/2->next 即为中间节点
这个思路没什么好说的,后面会贴一下代码实现。
2)快慢指针
我们需要创建两个指针 slow fast ,slow 每次移动一次,fast 每次移动两次,当 fast 指向为NULL或者 fast->next 指向NULL,就结束循环,此时 slow 指向的就是链表中间节点
二.代码实现
1)思路一
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* p = head;
int count = 0;
int k = 0;
while(p)
{
p = p -> next;
count++;
}
p = head;
while(k < count / 2)
{
k++;
p = p -> next;
}
return p;
}
2)思路二
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
ListNode* slow = head;
ListNode* fast = head;
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
注意:在上面这个代码里 while 循环的限制条件是不能倒换顺序的也就是(fast && fast ->next)如果倒置 fast->next 在前面时遇到偶数节点链表,代码会报错。
这道题到这就结束啦~是不是比上一题还简单,运用双指针就能飞快拿下啦~~
🎈🎈完结撒花🎈🎈