leetcode 删除链表的倒数第 N 个结点

 

这道题要求的是单次遍历,所以暴力肯定是不行了,我们可以尝试使用双指针,第一个指针P1从head开始,先走n步,再把head结点给第二个指针p2,此时两个指针相差n步,中间相差n-1个结点,同时移动两个结点,当P1到尾结点的next结点时,即P1==null时,p2即到达倒数第n个结点。因为要删除倒数第n个结点,所以我们把p2再往前挪一个单位。

public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy=new ListNode(0,head);
        ListNode p1=head;
        for(int i=0;i<n;i++)
            p1=p1.next;
        ListNode p2=dummy;
        while(p1!=null)
        {
            p1=p1.next;
            p2=p2.next;
        }
        p2.next=p2.next.next;
        return dummy.next;   //注意不能返回head,因为head也可能被删了


}

 

posted @ 2021-09-01 11:12  毅毅毅毅毅  阅读(44)  评论(0)    收藏  举报