zoukankan      html  css  js  c++  java
  • LeetCode 19 删除链表的倒数第N个节点

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

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

    示例:

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

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

    给定的 n 保证是有效的。

    进阶:

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



    链表类型的题画图来解比较清晰,对于单链表来说,删除节点的方法是找到需要删除的节点的前一个节点,将前一个节点的指针指向待删节点所指的下一个节点,即可完成删除操作。所以在这道题中,要找到倒数第n+1个节点。

    在链表的删除操作中,有可能会删掉头节点,所以需要先定义一个虚拟节点,让这个虚拟节点指向头节点。

    由于只进行一次扫描,可以定义两个指针,让其中一个先向前走n步,然后让两个指针同时向前走,直到第一个指针走到最末尾的节点终止。这样,第二个指针所指的节点就是倒数第n+1个节点。

    找到倒数第n+1个节点之后就可以进行删除操作。最后要注意返回的是虚拟节点的下一个节点,而不是头节点。

    c++代码如下:

    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            auto dummy = new ListNode(-1);
            dummy -> next = head;
            auto first = dummy, second = dummy;
            while(n--){
                first = first -> next;
            }
            while(first -> next){
                first = first -> next;
                second = second -> next;
            }
            second -> next = second -> next -> next;
            return dummy -> next;
                
        }
    };
  • 相关阅读:
    jsp设置footer底部内容
    dashboard项目心得:
    深度和广度优先算法
    一个action读取另一个action里的session
    算法笔记-0302
    JAVA基础---面向对象
    Flutter 读写本地文件
    Dart 处理json,built_value库
    Flutter 页面入栈和出栈
    web项目如何使用Material Icons
  • 原文地址:https://www.cnblogs.com/hellosnow/p/11557277.html
Copyright © 2011-2022 走看看