Your function implementation has nothing common with deleting a node starting from the end of the list.
This for loop
for (int i = 0; i < n; ++i) {
buf = &(*buf)->next;
}
counts nodes from the beginning of the list.
Also it can invoke undefined behavior when the list contains less than n elements due to using a null pointer to access memory.
And you need to delete the target node using the operator delete.
The function can look the following way as shown in the demonstration program below.
#include <iostream>
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
bool removeNthFromEnd( ListNode* &head, size_t n)
{
bool success = n != 0;
if ( success )
{
ListNode *last = head;
while ( last && n )
{
last = last->next;
--n;
}
if ( ( success = n == 0 ) )
{
ListNode **current = &head;
while ( last )
{
last = last->next;
current = &( *current )->next;
}
ListNode *tmp = *current;
*current = ( *current )->next;
delete tmp;
}
}
return success;
}
std::ostream & display( const ListNode *head, std::ostream &os = std::cout )
{
for ( ; head != nullptr; head = head->next )
{
os << head->val << " -> ";
}
return os << "null";
}
int main()
{
ListNode *head = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5)))));
display( head ) << '\n';
removeNthFromEnd( head, 2);
display( head ) << '\n';
removeNthFromEnd( head, 4);
display( head ) << '\n';
removeNthFromEnd( head, 2);
display( head ) << '\n';
removeNthFromEnd( head, 1);
display( head ) << '\n';
removeNthFromEnd( head, 1);
display( head ) << '\n';
return 0;
}
The program output is
1 -> 2 -> 3 -> 4 -> 5 -> null
1 -> 2 -> 3 -> 5 -> null
2 -> 3 -> 5 -> null
2 -> 5 -> null
2 -> null
null
mainprogram hidden from you. So your home-mademainprogram may not even look anything like the hiddenmainthat Leetcode is producing.