019.删除链表的倒数第 N 个节点——通过手绘图和 LinkedList 源码的讲解,你一定看得懂
题意
给你一个链表,删除链表的倒数第 n
个节点,并且返回链表的头节点。
难度
中等
示例
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
输入:head = [1,2], n = 1
输出:[1]
进阶:你能尝试使用一趟扫描实现吗?
分析
看到这道题,其实很容易想到 LinkedList 的 remove 方法,对吧?知道 remove 方法是如何实现的,就能写出这道题的题解。
我也曾在《二哥的 Java 进阶之路》上讲过 remove 方法的源码,其实现方式也非常简单,先遍历找到对应的节点,通过 node 方法实现,内核用的是 for 循环。
找到节点后,将节点的前一个节点的 next 指向节点的下一个节点;将节点的下一个节点的 prev 指向节点的前一个节点,这样就将节点从链表中删除了。
也就是前面提到的 unlink 方法。
LinkedList 其实比 LeetCode 这道链表的题复杂,因为 LinkedList 是双向链表,而 LeetCode 这道题是单向链表,下面是 LeetCode 为我们定义的链表 ListNode。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
把注释去掉大概就是这样子:
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
两个属性,或者叫成员变量、字段,一个是 val,一个是 next,val 是当前节点的值,next 是下一个节点的引用。
真诚点赞 诚不我欺
回复