当前位置:网站首页>LeetCode 19. 删除链表的倒数第 N 个结点

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

2022-06-26 04:56:00 碳烤小肥羊。。。

题目描述:给你一个链表,删除链表的倒数第 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]

思路解析

指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

首先这里我推荐大家使用虚拟头结点,这样方便处理删除实际头结点的逻辑。

  1. 定义fast指针和slow指针,初始值为虚拟头结点,如图:
    在这里插入图片描述

  2. fast首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作),如图:
    在这里插入图片描述

  3. fast和slow同时移动,直到fast指向末尾,如图:
    在这里插入图片描述

  4. 删除slow指向的下一个节点,如图:
    在这里插入图片描述

代码实现方式一

public static ListNode removeNthFromEnd(ListNode head, int n) {
    
        // 创建一个虚拟头结点
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        
        // 定义快慢指针
        ListNode fast = dummyNode, slow = dummyNode;
        
        // fast先走 n+1 步,这样slow就指向待删除结点的上一个结点
        while (n >= 0){
    
            fast = fast.next;
            n--;
        }
			// fast,slow同时向后移送
        while (fast != null){
    
            slow = slow.next;
            fast = fast.next;
        }
        
        slow.next = slow.next.next;

        return dummyNode.next;
    }

代码实现方式二

 public ListNode removeNthFromEnd(ListNode head, int n) {
    
        ListNode dummy = new ListNode(-1);
        dummy.next = head;

        ListNode slow = dummy;
        ListNode fast = dummy;
        while (n > 0) {
    
            fast = fast.next;
            n--;
        }
        // 待删除节点slow 的上一节点
        ListNode prev = null;
        while (fast != null) {
    
            prev = slow;
            slow = slow.next;
            fast = fast.next;
        }
        // 上一节点的next指针绕过 待删除节点slow 直接指向slow的下一节点
        prev.next = slow.next;
      
        return dummy.next;
    }
原网站

版权声明
本文为[碳烤小肥羊。。。]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_43751200/article/details/125455965