题目描述
题目链接19. 删除链表的倒数第 N 个结点
![在这里插入图片描述](https://img-blog.csdnimg.cn/38c969e46e114a30bd7537978bbc77c5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5b6F5Yir5LiJ5pel,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ef63bf676c9c44ce9c8fb983f0188ef4.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;
}
}