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

19. 删除链表的倒数第 N 个结点,第1张

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

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

指针解法或者快慢指针

实质上类似于做了一个减法,我们设从后往前数为倒序号,从前往后为正序号,那么 倒序号(1为起始下标)+正序号(1为起始下标)-1=总长度 ,由此公式可得:

  1. fast指针首先移动k个位置。
  2. slow指针和fast指针也一起移动,移动的基准为fast指针到底。
  3. 那么slow指针就刚好到我们要删除的元素的前一个位置。
  4. 以slow为基准,执行链表删除 *** 作即可。

由于链表具有头节点,那么上面的公式不应该减一,相当于正序号是从0开始的。

代码如下:

		
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode fast = head;
        ListNode slow = head;
        //fast移n步,目的是为了判断删除的位置
        for (int i = 0; i < n; i++) {
            fast = fast.next;
        }
        //如果fast为空,表示删除的是头结点
        if (fast == null) {
            return head.next;
        }

        while (fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        //当前slow为要删除的第k个节点第前一个节点
        slow.next = slow.next.next;
        return head;
    }
递归解法

TODO

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5673182.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存