题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点

方法1:快指针先走n步,两个指针再一起走,直到快指针的下一个节点为空,此时慢指针指向删除节点的前一个节点

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *p = head;//快指针,先走n步
        ListNode *q = head;//慢指针,指向删除节点的前一个节点
        while(p && n>0){
            p = p->next;
            n--;
        }
        if(p == nullptr){
            return head->next;//处理删除倒数第n个,即头节点的情况
        }
        while(p->next != nullptr){
            p = p->next;
            q = q->next;
        }
        q->next = q->next->next;
        return head;
    }
};

方法2:使用栈

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        stack<ListNode*> sck;
        ListNode *temp = new ListNode();
        temp->next = head;//避免处理第一个节点不一致的操作
        ListNode *p = temp;
        while(p){
            sck.push(p);
            p = p->next;
        }
        while(n--) sck.pop();
           
        ListNode *q = sck.top();
        q->next = q->next->next;
        return temp->next;
    }
};