链表的中间结点
题目要求
给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
示例1:
输入:[1,2,3,4,5]
输出:[3,4,5]
思路
如果这是一个空链表,直接返回头结点。然后我们设置一个快慢指针,快指针a一次走两格,慢指针b一次走一格,这样算一次循环,因为肯定是有返回值,所以,我们循环直接设置成死循环就可以了。
图解
代码实现
struct ListNode* middleNode(struct ListNode* head){
if (head == NULL)
{
return head;
}
struct ListNode* a = head;
struct ListNode* b = head;
while (1)
{
if (a->next != NULL)
{
a = a->next;
b = b->next;
}
else
{
return b;
}
if (a->next != NULL)
{
a = a->next;
}
else
{
return b;
}
}
}