//Middle of the Linked List
//Given a non-empty, singly linked list with head node head ,
//return a middle node of linked list.
//If there are two middle nodes, return the second middle node
//Example 1:
//Input:1,2,3,4,5]
//0utput:Node 3from this list(Serialization:[3,4,5])
//The returned node has value 3, (The judge's serialization of this node is [3,4,5]).
//Note that we returned a ListNode object ans, such that:
//ans,val =3,ans.next,val =4,ans.next,next.val = 5, and ans.next.next.next = NULL.
//Example 2:
//Input:I[1,2,3,4,5,6]
//Output:Node 4 from this list(serialization:[4,5,6])
//Since the list has two middle nodes with values 3 and 4, we return the second one.
#include <stdio.h>
#include <stdlib.h>
// Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode *next;
};
// Function to find the middle node
struct ListNode* middleNode(struct ListNode *head) {
struct ListNode *slow = head;
struct ListNode *fast = head;
// Move slow pointer one step and fast pointer two steps
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
// When fast reaches the end, slow is at the middle
return slow;
}
// Helper function to create a new ListNode
struct ListNode* createNode(int val) {
struct ListNode* newNode = (struct ListNode*) malloc(sizeof(struct ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// Helper function to print the linked list from a given node
void printList(struct ListNode* node) {
while (node != NULL) {
printf("%d ", node->val);
node = node->next;
}
printf("\n");
}
int main() {
// Example 1: [1, 2, 3, 4, 5]
struct ListNode* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(4);
head->next->next->next->next = createNode(5);
struct ListNode* middle = middleNode(head);
printf("Middle node value: %d\n", middle->val);
printf("List from middle node: ");
printList(middle);
// Example 2: [1, 2, 3, 4, 5, 6]
struct ListNode* head2 = createNode(1);
head2->next = createNode(2);
head2->next->next = createNode(3);
head2->next->next->next = createNode(4);
head2->next->next->next->next = createNode(5);
head2->next->next->next->next->next = createNode(6);
middle = middleNode(head2);
printf("Middle node value: %d\n", middle->val);
printf("List from middle node: ");
printList(middle);
return 0;
}