The structure of this List here is quite different . because it doesn't have a common list head. The head of this list only stores the first element of the list. So if you always meet 'rumtime error', mostly perhaps you think it does have a true 'head' of list and have used 'NULL->next' in any way. my C solution of 3ms is here. welcome to discuss.

```
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode* p1;
struct ListNode* p2;
struct ListNode* truehead=malloc(sizeof(struct ListNode));
truehead->next = head;
p1 = truehead;
p2 = truehead;
int cnt=0;
while(p2->next != NULL)
{
p2 = p2->next;
cnt++;
if (cnt>n)
{
p1=p1->next;
}
}
if(p1->next!=NULL)
{
p2 = p1->next;
p1->next = p2->next;
free(p2);
}
p1 = truehead->next;
free(truehead);
return p1;
}
```