19. 删除链表的倒数第 N 个结点 Java
Posted 可持续化发展
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了19. 删除链表的倒数第 N 个结点 Java相关的知识,希望对你有一定的参考价值。
给你一个链表,删除链表的倒数第 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]
处理链表类的问题,对于链表头节点可能变化的情况,就加一个虚拟头节点,减少特殊情况的处理。
链表的问题一定要画图。
破解版
/**
* 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 Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
//k 代表 dummy链表中一共有多少个节点
int k = 0;
for (ListNode p = dummy; p != null; p = p.next) k++;
ListNode p = dummy;
/**
* 因为加了虚拟头节点,
* 因此,数学规律是
* 要删除倒数第 n 个节点,则(在加了虚拟头节点后)
* 指针要从虚拟头节点开始往后移动 k - n - 1 次。
*/
for (int i = 0; i < k - n - 1; i++) {
p = p.next;
}
p.next = p.next.next;
return dummy.next;
}
}
纯净版
/**
* 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 Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
int k = 0;
for (ListNode p = dummy; p != null; p = p.next) k++;
ListNode p = dummy;
for (int i = 0; i < k - n - 1; i++) {
p = p.next;
}
p.next = p.next.next;
return dummy.next;
}
}
以上是关于19. 删除链表的倒数第 N 个结点 Java的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第53题 LeetCode 19. 删除链表的倒数第 N 个结点c++/java详细题解