题目描述
题目链接19. 删除链表的倒数第 N 个结点
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/400e7fe7fd87f0d4e86df7bec3021194.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8cd42317f7c74a16f3c9bcc2ff636c4b.png)
题解
- 利用快慢指针,删除倒数第n个,我们让快指针先走n - 1步。然后慢指针再从头出发,与快指针同时前进。当快指针走到结尾的时候,slow.next就是要删除的节点。 执行slow.next = slow.next.next即可。
- 注意特殊情况:要删除的节点为头节点的时候,是一种特殊情况,需要单独考虑。 单独考虑的代码比较繁琐,所以我们把删除头节点变成一般情况就好了。新建一个哑节点dummy,dummy.next = head。 然后快慢指针同时从哑节点出发,这样就把特殊情况转化为一般情况(哑节点在做链表题的时候非常好用)
完整代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode fast = dummy, slow = dummy;
for (int i = 0; i < n; i++){
fast = fast.next;
}
while (fast.next != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummy.next;
}
}