Every day a leetcode
题目来源:876. 链表的中间结点
解法1:遍历
先遍历一次链表,得到链表的长度len。
第len / 2处的结点就是中间结点。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head){
int len=0;
struct ListNode* p=head;
struct ListNode* ans=head;
while(p)
{
len++;
p=p->next;
}
for(int i=0;i<len/2;i++) ans=ans->next;
return ans;
}
结果:

解法2:快慢指针
设置一个快指针和一个慢指针,快指针一次走 2 步,慢指针一次走 1 步。
分两种情况:
- 链表长度为奇数,当快指针指向链表的最后一个结点时,慢指针指向中间结点;
- 链表长度为偶数,当快指针指向链表最后一个结点的next时,慢指针指向中间结点。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* fast=head;
struct ListNode* slow=head;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
结果:

这篇博客介绍了如何在单链表中找到中间节点,提供了两种不同的解决方案。第一种方法是先遍历链表获取长度,然后定位到中间;第二种方法使用快慢指针,快指针每次前进两步,慢指针一步,最终慢指针会停在中间节点。这两种方法都有效地解决了问题,适用于链表操作。
508

被折叠的 条评论
为什么被折叠?



