1. 遍历结点个数
#include <stdio.h>
#include <stdlib.h>
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LinkNode;
LinkNode* LinkNodemid_A(LinkNode *head)
{
if (head == NULL || head->next == NULL)
{
return head;
}
int n = 0;
LinkNode *p = head;
while (p != NULL)
{
n += 1;
p = p->next;
}
p = head;
for (int i = 0; i < n / 2; i++)
{
p = p->next;
}
return p;
}
2. 快慢指针法
LinkNode* LinkNodemid_B(LinkNode *head)
{
LinkNode *fast = head;
LinkNode *slow = head;
while (fast != NULL && fast->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
慢指针始终指向快指针走过路径的中间,当快指针遍历完链表后,慢指针恰好指向链表的中间