LeetCode | 19. 删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

Code: 递归法

class Solution {
public:
    int cur=0;
    ListNode* removeNthFromEnd(ListNode* head, int n) {
       if(!head) return NULL;
       head->next = removeNthFromEnd(head->next,n);
       cur++;
       if(n==cur) return head->next;
       return head;
    }
};

Code: 双指针法

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // 快慢双指针法
        ListNode *p = head, *q = head;
        while(n>0){q=q->next;n--;}  // 让快指针q先跑n个
        if(q==NULL){return head->next;}  // q跑到头NULL说明删除的是头结点,用头结点的下一个作为返回值即可
        while(q->next!=NULL){p = p->next; q = q->next;}  // 快慢指针一起跑,当快指针到尾结点时停止
        p->next = p->next->next;  //此时p指针为要删除的结点的前一个结点
        return head;
    }
};