Leecode刷题——链表——删除倒数第N个节点(双指针法)

本次总结的问题是删除链表中的倒数节点,我们知道链表查找的时间复杂度是O(n)所以想要像数组那样实现常数时间内倒数第n个删除节点是比较困难的,这里需要借助双指针法来进行操作

删除倒数第N个节点(题号19)

例19题目:

Leecode刷题——链表——删除倒数第N个节点(双指针法)_第1张图片 

1.双指针

设两个指针fast和slow,控制fast在slow后方,这样就可以实现链表不同位置的同时操作。针对本题,我们可以先让fast走n步,之后让slow和fast同时走,这样当fast走到链表末尾的时候slow便是倒数第n个节点(实际上让fast先走n+1步,因为这样slow指向倒数第n个节点的前一个节点便于删除)

2.代码说明

/**
 * 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) {
        ListNode fhead = new ListNode(0);
        //虚拟头结点的创建
        fhead.next=head;
        ListNode p=fhead;
        ListNode pre=fhead;
        //创建双指针p和pre
        while(n-->=0){
            p=p.next;
        }
        //控制p走n-1步
        while(p!=null){
            pre=pre.next;
            p=p.next;
        }
        //p和pre一起走保证n的间隔
        pre.next=pre.next.next;
        //删除倒数第n个节点
        return fhead.next;
    }
}

你可能感兴趣的:(leetcode,算法,java)