Ваша функция работает. Список поврежден еще до того, как попал туда. Вот мой тест, который работает.
typedef struct Node
{
Node* next;
int data;
} Node;
int getMiddle(Node *head)
{
if (head == NULL)
return -1;
Node* fast = head;
Node* slow = head;
for (; fast != NULL && fast->next != NULL; fast = fast->next->next, slow = slow->next)
;
return slow->data;
}
static Node* head = new Node();
void AddNode()
{
Node* node = head;
while (node->next)
{
node = node->next;
}
node->next = new Node();
node->next->next = NULL;
node->next->data = node->data + 1;
}
int main()
{
for (int i = 0; i < 1000; i++)
{
AddNode();
}
printf("Middle %d", getMiddle(head));
}
Это выводит 500, что правильно