[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 head, int n) {
        if (null == head || n <= 0) {
            return head;
        }
        ListNode slowPre = head;//比slow节点慢1个位置
        ListNode slow = head;//比fast节点慢n个位置
        ListNode fast = head;
        int slowCount = 0;
        while (null != fast) {
            if (n > 0) {
                fast = fast.next;
                n--;
                if (n == 0 && null == fast) {//当倒数第n个节点,刚好是首节点,直接返回head.next
                    return head.next;
                }
            } else {
                fast = fast.next;
                slow = slow.next;
                if (slowCount == 1) {
                    slowPre = slowPre.next;
                } else {
                    slowCount++;
                }
            }
        }
        slowPre.next = slow.next;
        return head;
    }

原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/12069856.html

时间: 2024-11-06 10:39:25

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

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

题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的. 进阶: 你能尝试使用一趟扫描实现吗? 解题思路 典型的利用双指针法解题.首先让指针first指向头节点,然后让其向后移动n步,接着让指针sec指向头结点,并和first一起向后移动.当first的next指针为NULL时,

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个节点 - [链表]

题目链接: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