• LeetCode 第 19 号问题:删除链表的倒数第 N 个节点


    本文首发于公众号「五分钟学算法」,是 图解 LeetCode 系列文章之一。
    个人网站: https://www.cxyxiaowu.com

    题目来源于 LeetCode 上第 19 号问题:删除链表的倒数第 N 个节点。题目难度为 Medium,目前通过率为 34.4% 。

    题目描述

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

    示例:

            给定一个链表: 1->2->3->4->5, 和 n = 2.
    
    当删除了倒数第二个节点后,链表变为 1->2->3->5.
          

    说明:

    给定的 n 保证是有效的。

    进阶:

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

    题目解析

    采取双重遍历肯定是可以解决问题的,但题目要求我们一次遍历解决问题,那我们的思路得发散一下。

    我们可以设想假设设定了双指针pq的话,当q指向末尾的NULLpq之间相隔的元素个数为n时,那么删除掉p的下一个指针就完成了要求。

    • 设置虚拟节点dummyHead指向head
    • 设定双指针pq,初始都指向虚拟节点dummyHead
    • 移动q,直到pq之间相隔的元素个数为n
    • 同时移动pq,直到q指向的为NULL
    • p的下一个节点指向下下个节点

    动画描述


    v2-06fd9a4a0dd680f8ad7319abc26c46a4_b.gif


    代码实现

            class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
         ListNode* dummyHead = new ListNode(0);
            dummyHead->next = head;
    
            ListNode* p = dummyHead;
            ListNode* q = dummyHead;
            for( int i = 0 ; i < n + 1 ; i ++ ){
                q = q->next;
            }
    
            while(q){
                p = p->next;
                q = q->next;
            }
    
            ListNode* delNode = p->next;
            p->next = delNode->next;
            delete delNode;
    
            ListNode* retNode = dummyHead->next;
            delete dummyHead;
    
            return retNode;
    
        }
    };
          


    v2-3af2339a6056d546cf4383d39233e8fa_b.jpg

  • 相关阅读:
    jvm
    java8新特性Lambada,Steam流
    数组链表栈队列 散列表
    数据结构算法基本知识
    设计模式七大原则
    java关键字
    Excel导出(适合项目开发)
    Excel导出(适合初学者)
    angular.min.js:80 Error:
    angular中出现错误的提示指令[ng:areq]的原因
  • 原文地址:https://www.cnblogs.com/csnd/p/16675403.html
Copyright © 2020-2023  润新知