19. 删除链表的倒数第 N 个结点 题解

解题思路

  • 算法思想:快慢指针法:先将二者形成n的距离差,然后同时等速前进,到达最终位置时,慢指针指向的下一个位置,即是目标要倒数n个位置之后的结点。

代码

  • C++实现
// -*- coding: utf-8 -*-
//  @ Date   : 2021/5/20 13:14
//  @ Author : RichardLau_Cx
//  @ file   : Richard.cpp
//  @ IDE    : Dev-C++
//  @ Source : leetcode

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
    /**
     * 算法思想:快慢指针法:先将二者形成n的距离差,然后同时等速前进,到达最终位置时,
     * 慢指针指向的下一个位置,即是目的要倒数n个位置之后的结点(一趟扫描实现)。
     */
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // 定义一个虚拟头结点(防止头结点改变后出错),给到值和下一个结点
        ListNode *root = new ListNode(0, head);  
        ListNode *p = root;  // 指向虚拟的头结点
        ListNode *q = head;  // 指向真正的头结点

        for (int i=0; i < n; i++)
        {  // 令q先向后移动n步(与p拉开距离n)
            q = q->next;
        }

        while (q != nullptr) 
        {  // q不为空时,两个指针同时向后移动
            p = p->next;
            q = q->next;
        }

        // 此时(表面上)删除p结点所指的下一个结点(直接指向下下个结点)
        p->next = p->next->next;

        // 返回相当于倒数n个位置后的结点
        return root->next;  
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值