zoukankan      html  css  js  c++  java
  • 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/

    欢迎讨论和交流!


  • 相关阅读:
    Spring AOP + Redis 实现针对用户的接口访问频率限制
    Flutter 圆形透明 Loading 弹窗
    VUE 自定义组件的双向数据绑定 和替代钩子
    10个前端技巧
    前端中的数据库
    cors 跨域问题
    promise解决回调地狱问题
    VUE框架JS组件的封装 --Vue.extend
    HBuilderX 用夜神模拟器运行vue项目
    vue关于axios 拦截器的使用
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/13406246.html
Copyright © 2011-2022 走看看