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也可能被删了 }


浙公网安备 33010602011771号