题目描述
给你单链表的头结点 head ,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
首先,本博客讲解两种解体思路:
暴力求解法
快慢指针法
暴力求解法
根据题目要求,返回中间节点,则我们可以先遍历一遍链表来求得其长度,然后根据长度求出中间节点即可
代码
struct ListNode* middleNode(struct ListNode* head) {
int num = 0;
struct ListNode* cur = head;
struct ListNode* cur2 = head;
while(cur)
{
num++;
cur = cur->next;
}
int num1 = num/2;
while(num1--)
{
cur2 = cur2->next;
}
return cur2;
}
快慢指针法:
这个方法使用两个指针,
slow
和fast
,然后slow每走一步,fast走两步。
当有奇数个节点时,当fast->next = NULL
时,slow指向要求的节点
当有偶数个节点时,当fast
为空时,slow指向要求的节点
代码
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;
}