LeetCode 19. 删除链表的倒数第N个节点(Remove Nth Node From End Of List)

题目描述

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

示例:

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

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

说明:

给定的 n 保证是有效的。

进阶:

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

解题思路

典型的利用双指针法解题。首先让指针first指向头节点,然后让其向后移动n步,接着让指针sec指向头结点,并和first一起向后移动。当first的next指针为NULL时,sec即指向了要删除节点的前一个节点,接着让first指向的next指针指向要删除节点的下一个节点即可。注意如果要删除的节点是首节点,那么first向后移动结束时会为NULL,这样加一个判断其是否为NULL的条件,若为NULL则返回头结点的next指针。

代码

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* removeNthFromEnd(ListNode* head, int n) {
12         ListNode* first=head;
13         while(n--!=0)
14             first=first->next;
15         if(!first)
16             return head->next;
17         ListNode* sec=head;
18         while(first->next!=NULL){
19             sec=sec->next;
20             first=first->next;
21         }
22         sec->next=sec->next->next;
23         return head;
24     }
25 };

原文地址:https://www.cnblogs.com/wmx24/p/9084508.html

时间: 2024-10-13 17:20:10

LeetCode 19. 删除链表的倒数第N个节点(Remove Nth Node From End Of List)的相关文章

leetcode 19: 删除链表的倒数第N个节点

题目:  给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 1 ListNode* removeNthFromEnd(ListNode* head, int n) { 2 ListNode *p = head, *q = head; 3 while(n-- > 0 && nullptr != p

LeetCode 19——删除链表的倒数第 N 个节点

1. 题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的. 进阶: 你能尝试使用一趟扫描实现吗? 2. 思路 定义两个指针 p1.p2,刚开始两个指针都指向头结点.如果要删除倒数第 N 个结点,我们就让 p2 先前进 N-1 步,这时候 p2 后面的节点个数为 K,那我们要删除的

[LeetCode] 19. 删除链表的倒数第N个节点 ☆☆☆

描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.说明: 给定的 n 保证是有效的. 进阶: 你能尝试使用一趟扫描实现吗? 解析 用三指针,fast比slow快n个位置,slowPre是slow的pre节点. 代码 public static ListNode removeNthFromEnd(ListNode

LeetCode 19 - 删除链表的倒数第N个节点 - [链表]

题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ 题解: 两个 $p,q$ 指针均指向头,然后 $q$ 先往前走 $n$ 步,然后 $p,q$ 一起走,直到 $q$ 走到底,此时 $p$ 的位置即倒数第 $n$ 个的位置. AC代码: static const auto io_sync_off = []() { std::ios::sync_with_stdio(0); std::cin.tie(0);

19. 删除链表的倒数第N个节点

19. 删除链表的倒数第N个节点 1A,开心~ 注意,题目有进阶要求,只允许扫链表1次, 很多链表题跟这个思路一样,在遍历链表的时候,维护一个距离与当前头指针为(n+1)的尾巴标记P即可,当扫到链表结尾的时候,此时P正好指向待删除节点的前一个节点 注意几个细节处理: 0:注意P的初始化 1:n>链表长度时,无需处理 2:n == 链表长度时,P此时仍没有指向任何一个节点,需要特判把头节点删除 class Solution { public ListNode removeNthFromEnd(Li

领扣(LeetCode)删除链表的倒数第N个节点 个人题解

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的. 进阶: 你能尝试使用一趟扫描实现吗? 快慢针的思想.快针先移动N个步长,然后两个针一起移动,快针结束时,慢针指向倒数第N+1个节点.然后就是简单的删除节点操作了.这里需要注意删除的节点是第一个节点的特判. 这里由于使用了JAVA,对

leetcode(10)-删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 链接 https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ 凑数吧 class Solution: def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: lists = [] arrow = head while arrow: lists.append(arrow) arrow

19. 删除链表的倒数第N个节点——LeetCode

心得:对于链表问题,加头指针可能简化问题 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { if(head==null) return

LeetCode:删除链表的倒数第N个节点

C++示例: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: // 一趟扫描实现 ListNode* removeNthFromEnd(ListNode* head, int n) { if (head == NULL