convert sorted list to binary search tree

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

public:
TreeNode *sortedListToBST(ListNode *head) {
int len = getListLen(head);
if(len == 0) return NULL;
return generateBST(head,0,len-1);
}
private:
int getListLen(ListNode* head){
int len = 0;
while(head != NULL){
len++;
head = head->next;
}
return len;
}
TreeNode* generateBST(ListNode* head, int l, int r){
if(l>r) return NULL;
int mid = l + (r-l)/2;
ListNode* p = head;
for(int i=l; i<mid; i++){
p = p->next;
}
TreeNode* root = new TreeNode(p->val);
root->left = generateBST(head,l,mid-1);
root->right = generateBST(p->next,mid+1,r);//相应的需要变化
}
//Approach 2: 自底而上,O(n)
TreeNode* generateBST(ListNode* &head, int l, int r){//引用
if(l>r) return NULL;
int mid = l + (r-l)/2;
TreeNode* leftNode = generateBST(head,l,mid-1);//返回子链的根
//head 如何变化?????为何指向链中点
TreeNode* root = new TreeNode(head->val);//没明白
head = head->next;
TreeNode* rightNode = generateBST(head,mid+1,r);
root->left = leftNode;
root->right = rightNode;
}