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;
}
结果: