https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

双指针

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
思路是这样的,但要注意一些细节。
分为如下几步:
截图_20220716120750.png

先让fast先走 n 步, 然后fast和slow再一起每次走一步
截图_20220816120858.png
这样当fast到结尾就是这样
截图_20221016121004.png
slow指针就是我们要删除的节点,但是我们要找到的是此刻slow指针的上一个节点,才方便删除,因此,流程应该是这样, 先让fast走n + 1步,然后fast和slow再每次走一步,直到fast遇到null, 这样到最后,slow指针就指的是要删除节点的上一个节点了,删除就很方便
截图_20221316121301.png

截图_20221316121329.png
截图_20221416121414.png

  1. public ListNode removeNthFromEnd(ListNode head, int n) {
  2. ListNode newHead = new ListNode(0, head);// 虚拟头节点
  3. ListNode fast = newHead;
  4. ListNode slow = newHead;
  5. // 让fast先走n步
  6. while (n-- > 0) {
  7. fast = fast.next;
  8. }
  9. fast = fast.next; // fast还要再走1步, 因为需要让slow指向删除节点的上一个节点
  10. while (fast != null) {
  11. fast = fast.next;
  12. slow = slow.next;
  13. }
  14. slow.next = slow.next.next;
  15. return newHead.next;
  16. }
  17. public class ListNode {
  18. int val;
  19. ListNode next;
  20. ListNode() {}
  21. ListNode(int val) { this.val = val; }
  22. ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  23. }