每日一题:删除链表的倒数第N个节点

90 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

题目链接

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

示例 1:

image.png

输入: 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

解题思路:(双指针)

本题可以使用双指针来做题

如果要删除倒数n个节点,只需要让右指针right向右移动n步,再让leftright共同向右移动,直到右指针到链表末尾,这时候,left指向的节点正是我们想要删除掉的那个节点。

因为题中有涉及到删除的操作,我这里就需要创建一个虚节点来完成这个操作,这样做方便些

具体步骤:

  • 定义两个指针left,right,分别指向链表的虚拟头节点
  • right向右移动 n
  • leftright 共同向右移动
  • 这里有一个要注意的点:因为左指针指向的节点恰好是我们要删除的节点,这就导致我们没办法直接删除这个节点。
  • 我们还需要一个指针per,让指针per指向要删除节点的上一个节点,当左指针指向要删除的节点时,我们可以通过per.next = left.next这个操作来删除节点
  • 最后返回头节点即可

代码: (Java实现)

        //创建虚节点
        ListNode list =  new ListNode(-1);
        
        list.next = head;

        
        ListNode left = dummy;
        ListNode right = dummy;
        ListNode per = null;
        
        //进行right的移动
        while (n > 0) {
            right = right.next;
            n--;
        }

        while (right != null) {
            per = left;
            left = left.next;
            right = right.next;
        }

        //
        per.next = left.next;

        return dummy.next;

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

提交结果

image.png