【双指针】19. 删除链表的倒数第 N 个结点

【双指针】19. 删除链表的倒数第 N 个结点

解题思路

  • 快慢指针
  • 删除倒数第n个节点 那么需要找到它的前驱节点,然后删除
  • 那么需要找到倒数第n + 1个节点
  • 设置快慢指针fast slow指针,先让fast指针走n + 1个节点 然后停下,快慢指针同时开始移动
  • 当快指针移动到null 之后,慢指针指向的就是倒数第n + 1个节点,然后删除倒数第n个节点即可
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    
    
    public ListNode removeNthFromEnd(ListNode head, int n) {
    
    
        // 使用双指针  快慢指针算法  
        // 删除倒数第n个节点 让fast移动n个节点  然后fast和slow同时开始移动
        // 当fast指针指向链表末尾的时候  删除slow指向的节点就可以

        // 思路是使得快慢指针之间差距n个节点
        // 那么当快指针走到null 的时候 那么因为快慢指针使用差距n个节点
        // 那么慢指针指向的就是倒数第n个节点

        // 创建一个哑结点
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;

        // 创建快慢指针
        ListNode fast = dummyNode;
        ListNode slow = dummyNode;

        // 快指针走n节点
        for(int i = 0; i < n; i++){
    
    
            fast = fast.next;
        }
        // 但是要删除倒数第n个节点 那么就需要找到倒数第n+ 1个节点 
        // 也就是前驱节点
        fast = fast.next;

        // 现在快慢指针差距n + 1个节点 将快指针指向null 走到链表的末尾
        while(fast != null){
    
    
            fast = fast.next;
            slow = slow.next;
        }

        // 此时fast指向链表末尾 null slow指向倒数第N+ 1个节点
        // 那么开始删除倒数第n个节点
        slow.next = slow.next.next;


        return dummyNode.next;// 返回head
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44653420/article/details/131706486