19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 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]
分析:
这是一道双指针的经典应用题,但是我们今天不用双指针,使用最朴素的算法,比较好理解,然后再用双指针算法加深印象。
1、先求出链表的大小size
2、要求删除倒数第N个结点,等价于删除正数第size-N+1个结点
3、正向循环遍历到正数第size-N+1个结点的前一个节点改变其next即可。
package com.codernav.demo.leetcode.linkedlist.removeElements; import com.codernav.demo.common.ListNode; /** * @title 19. 删除链表的倒数第 N 个结点 * @Description 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 * @Author 开发者导航 * @website https://www.codernav.com * @date 2023/3/4 */ public class Q_19 { public static void main(String[] args) { ListNode node5 = new ListNode(5, null); ListNode node4 = new ListNode(4, node5); ListNode node3 = new ListNode(3, node4); ListNode node2 = new ListNode(2, node3); ListNode node1 = new ListNode(1, node2); ListNode head = f(node1, 2); System.out.println(head); } public static ListNode f(ListNode head, int n) { if (head == null) { return null; } // 求结点个数,注意不能直接操作head结点,使用临时结点 int size = 0; ListNode temp = head; while (temp != null) { size++; temp = temp.next; } // 倒数第n个,也是正数第size-n+1个 int N = size - n + 1; // 虚拟结点 ListNode dummyNode = new ListNode(-1); dummyNode.next = head; ListNode prev = dummyNode; // 遍历到第n-1个时,删除结点 int step = 0; while (prev.next != null) { if (step == N - 1) { prev.next = prev.next.next; break; } prev = prev.next; step++; } return dummyNode.next; } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...