给你一个链表,删除链表的倒数第 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]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
方法一:
- 找到倒数第n个节点delNode的前一个节点pre
- 利用pre删除delNode
代码:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 暴力 找到倒数第n个节点 删除该节点 5 - 2 pre = cnt正着数三个
int size = getSize(head);
// 如果n == size 此时就是删除第一个节点。
if (n == size) return head.next;
findDelNodePre(head, n, size);
return head;
}
private static int getSize(ListNode head) {
int cnt = 0;
while (head != null) {
cnt ++;
head = head.next;
}
return cnt;
}
private static void findDelNodePre(ListNode head, int n, int size) {
int cnt = 1;
// 1 2 3 n = 2, size = 3, 3 - 2 = 1 cnt = 0
// cnt
while (head != null) {
if ((cnt++) == (size - n)) {
ListNode delNode = head.next;
head.next = delNode.next;
delNode.next = null;
}
head = head.next;
}
}
}
时间复杂度:O(n)
空间复杂度:O(1)