题意:


方法:
模拟

思路:
        首先,统计链表长度 num;
        然后,num - n 得到从前往后遍历删除的节点编号;
        最后,遍历删除。
        
        注意:删除某节点要先得到某节点的前一个节点。

    


class Solution {
public:
    
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(head==nullptr)
            return nullptr;
        int num=0;
        for(ListNode* p=head;p;p=p->next){//统计链表长度
            num++;
        }
        int t=num-n;//删除正向第t个节点,t从0开始
        ListNode *p=head,*q=head->next;
        if(t==0){//如果是第一个节点
            head=head->next;
        }else{
            t--;
            while(t--){//删除某节点要先得到某节点的前一个节点
                p=p->next;
                q=q->next;
            }
            p->next=q->next;
        }
        return head;
    }
};

时间复杂度:
空间复杂度: