问题描述
给定一个头结点为
head
的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
示例
输入:[1,2,3,4,5] 输出:返回的结点值为 3
输入:[1,2,3,4,5,6] 输出:该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点 4
解题思路一:首先,先统计出链表中节点的个数,然后,从头节点进行遍历,遍历到节点总数的一半即可。
代码实现:
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* cur = head;
int count = 0;
while(cur)
{
count++;
cur = cur->next;
}
int tmp = 0;
while(head && (tmp < (count/2)))
{
head = head->next;
tmp++;
}
return head;
}
解题思路二:可以使用快慢指针法来完成该问题,首先让fast和slow同时指向head,每次fast走两步,slow走一步,最后返回slow即可。画图分析:
代码实现:
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode *fast,*slow;
fast = head;
slow = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}