Given a singly linked list, write an efficient algorithm to find the middle element in a single pass.
Represent each node as a dictionary with value and next; next is another node or null. Return the middle value. For an even-length list, return the second of the two middle elements.
Examples: [1, 2, 3, 4, 5] returns 3; [1, 2, 3, 4] returns 3.
Constraints: The list may be empty, and contains at most 1,000 nodes.
def find_middle(head):