题目背景
给你一个链表,删除链表的倒数第 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]
重要思路及出错点
- 注意还是需要引入虚拟节点。
- slowNode和fastNode在初始化的时候,可以直接等于虚拟节点了,不能设为null,否则.next后会报错。
- fastNode最先移动几步可以直接移动,不必担心链表长度问题,因为题意使其满足至少是有这些元素的。
- 循环的终止条件不是fastNode等于null的时候,具体的需要思考具体的链表的整体结构来考虑。
- 特别需要注意的是,slowNode指向的是需要操作的节点的前一个结点,因为只有这样才能操作该结点。最后也一步也只是关于slowNode的操作(slowNode.next = slowNode.next.next)。
代码实现
// 19. 删除链表的倒数第 N 个结点
public ListNode removeNthFromEnd(ListNode head, int n){
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
ListNode slowNode = dummyNode;
ListNode fastNode = dummyNode;
for(int i = 0; i < n;i++){
fastNode = fastNode.next;
}
while(fastNode.next != null){
fastNode = fastNode.next;
slowNode = slowNode.next;
}
slowNode.next = slowNode.next.next;
return dummyNode.next;
}
参考资料:19.删除链表的倒数第N个节点