剑指 Offer II 021. 删除链表的倒数第 n 个结点

126 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

一、题目描述:

给定一个链表,删除链表的倒数第 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  

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/SL…

二、思路分析:

删除链表的倒数第n个节点,首先想到是首先从头节点开始对链表进行一次遍历,得到链表的长度 。随后再从头节点开始对链表进行一次遍历,当遍历到第 L-n+1 个节点时,它就是我们需要删除的节点。但是进阶要求一趟扫描实现,那么可以利用快慢指针,只用一次遍历。 具体做法 增加虚拟节点,并把虚拟节点指向head(之所以要增加虚拟头节点是为了要简化代码当中的非空判定,这是链表题目的通用套路) 让快指针向前先走n步 快慢指针同步齐步向前走直至快指针走到了链表末尾 这时慢指针的next刚好指向刚好指向倒数第n个结点,将它的next的指向next.next即达到了删除的效果 返回虚拟节点的next也就是head

三、AC 代码:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {

        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode fast = head;
        ListNode slow = dummyHead;
        while(n-- > 0) {
            fast = fast.next;
        }
        while(fast != null) {
            slow = slow.next;
            fast = fast.next;
        }
        slow.next = slow.next.next;
        return dummyHead.next;

    }
}

四、总结:

image.png

写题解不易,若对你有帮助,点赞评论再走吧。ヽ(✿゚▽゚)ノ,如有不足,请大家斧正。