算法(链表)——删除链表的倒数第N个结点

文章目录

    • 1.题目描述
    • 2.解题思路
    • 3.代码实现


1.题目描述

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

示例1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:
输入:head = [1], n = 1
输出:[]

示例 3:
输入:head = [1,2], n = 1
输出:[1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list

2.解题思路

    可以使用双指针法。首先建立一个虚拟头结点,让快慢指针都等于虚拟头结点。紧接着让快指针先向前走n+1步,之后再让快慢指针一起向前走,直到fast = NULL为止。
    先走n+1步是因为我们需要删除的是倒数第n个结点,那么就要让slow->next = 删除结点的前一个结点,这样才方便我们的操作。

3.代码实现

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* fast = dummyHead;//初始化快、慢指针等于虚拟头结点
        ListNode* slow = dummyHead;
        int t = n + 1;
        while(t--)//让快指针先走n+1步
        {
            fast = fast->next;
        }
        while(fast != NULL)//让快慢指针一起移动,慢指针指向倒数第n+1个结点
        {
            fast = fast->next;
            slow = slow->next;
        }
        ListNode* tmp = slow->next;//保存要删除的结点
        slow->next = slow->next->next;
        delete tmp;
        return dummyHead->next;
    }
};

你可能感兴趣的:(算法(链表),算法,链表,数据结构,leetcode,c++)