LeetCode19删除链表的倒数第N个节点

Posted 臭咸鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode19删除链表的倒数第N个节点相关的知识,希望对你有一定的参考价值。

题目链接

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

题解一

  • 双指针:一个“快”,一个“慢”
  • 快指针先到达链表末尾
  • 具体思路见代码及注释
// Problem: LeetCode 19
// URL: https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
// Tags: Linked List Two Pointers Recursion
// Difficulty: Medium

#include <iostream>
using namespace std;

struct ListNode{
    int val;
    ListNode* next;
};

class Solution{
public:
    // 删除链表的倒数第N个结点
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // 快慢指针
        ListNode* fast = head, *slow = head;
        // 快指针先移动N+1步,慢指针不移动
        int i = 0;
        while (i <= n && fast != nullptr){
            fast = fast->next;
            i++;
        }
        // 这个if语句和上个while循环中的fast!=nullptr都是为了处理一种特殊情况:
        // 假如链表只有N个元素且要删除倒数第N个元素,则快指针不能移动N+1步,这时应直接删除头结点
        if(i!=n+1){
            // 删除头结点并返回新链表
            head = head->next;
            delete slow;
            return head;
        }
        // 快指针和慢指针一起移动直至快指针为空
        // 因为快指针先移动了n+1步,所以循环结束后慢指针是指向待删除结点前面的那个结点
        while(fast!=nullptr){
            fast = fast->next;
            slow = slow->next;
        }
        // 删除待删除的结点并返回新链表
        fast = slow->next;
        slow->next = fast->next;
        delete fast;
        return head;
    }
};

题解二

  • 递归写法,很厉害,我参考了别人的
// Problem: LeetCode 19
// URL: https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
// Tags: Linked List Two Pointers Recursion
// Difficulty: Medium

#include <iostream>
using namespace std;

struct ListNode{
    int val;
    ListNode* next;
};

class Solution{
private:
    int index=0;
public:
    // 删除链表的倒数第N个结点
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(head == nullptr) return nullptr;
        // 递归表达式
        head->next = removeNthFromEnd(head->next, n);
        // 该变量用来标记是倒数第几个结点,这条语句写在了递归表达式之后,这很关键
        index++;
        // 此时head即为待删除结点前边的那个结点
        if(index == n) return head->next;
        return head;
    }
};

作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


以上是关于LeetCode19删除链表的倒数第N个节点的主要内容,如果未能解决你的问题,请参考以下文章

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

Leetcode 19 删除链表的倒数第 N 个节点

LeetCode - 19 - 删除链表的倒数第N个节点 - Java

LeetCode(19):删除链表的倒数第N个节点

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

LeetCode 19 - 删除链表的倒数第N个节点 - [链表]