加载中...
19-删除链表的倒数第 N 个结点(Remove Nth Node From End of List)
发表于:2021-12-03 | 分类: 中等
字数统计: 568 | 阅读时长: 2分钟 | 阅读量:

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

英文原文

Given the head of a linked list, remove the nth node from the end of the list and return its head.

 

Example 1:

Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]

Example 2:

Input: head = [1], n = 1
Output: []

Example 3:

Input: head = [1,2], n = 1
Output: [1]

 

Constraints:

  • The number of nodes in the list is sz.
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

 

Follow up: Could you do this in one pass?

中文题目

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

 

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

 

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

 

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

通过代码

高赞题解

题目解析

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

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

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

动画描述

{:width=”400”}
{:align=”center”}

代码实现

[]
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; } };

统计信息

通过次数 提交次数 AC比率
578191 1339458 43.2%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
18-四数之和(4Sum)
下一篇:
20-有效的括号(Valid Parentheses)
本文目录
本文目录