19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
Categories:
题意:
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
难度:
中等
分析:
题目一共要求做两件事
- 找到链表的倒数第n个节点
- 删除该节点
对于单项链表, 如何找到节点的位置?
可以两次遍历, 第一次遍历拿链表长度
第二次才获取具体的节点
如何删除该节点?
删除节点涉及到三个部分
前驱节点, 该节点, 后驱节点
所以我们在第一步拿到前驱节点, 并保存后驱节点, 修改引用就算删除完毕
遍历链表
while (current != null) { length++; current = current.next; }
注意是倒数第 n 个节点,所以要用链表的长度减去 n。倒数第 4 个节点的前一个节点就是 5-4=1,也就是第一个节点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 创建一个虚拟头节点,简化边界条件处理
ListNode dummy = new ListNode(0);
dummy.next = head;
// 第一次遍历,计算链表的总长度
int length = 0;
ListNode current = head;
while (current != null) {
length++;
current = current.next;
}
// 设置长度为到达要删除的节点的前一个节点
int index = length - n;
current = dummy;
// 第二次遍历,找到要删除的节点的前一个节点
for (int i = 0; i < index; i++) {
current = current.next;
}
// 删除节点,即跳过要删除的节点
current.next = current.next.next;
return dummy.next;
}
}