代码如下
package com.qyx.test;
public class removeListNodeRev { /** * 删除单向链表中的倒数第n个链表 * 使用双指针算法,可以实现一次遍历即可删除 * 方案如下: * 第一个节点先走了n+1步,第二个节点停着,那么他们两个就差了n+1步, * 然后进行遍历,直到第一个节点遍历到尾部,第二个节点遍历的位置距离尾部就是n+1; * 因为在之后的移动中,他们是一起移动的 */ public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy=new ListNode(0); dummy.next=head; ListNode first=dummy; ListNode second=dummy; for(int i=1;i<=n+1;i++) { first=first.next; } while(first!=null) { first.next=first; second.next=second; } second.next=second.next.next; return dummy.next; } /** * 单指针 ,实现两次遍历即可删除、 * 添加哑结点 * L-n+1节点就是我们要删除的节点 */ public ListNode removeNthFromEnd02(ListNode head, int n) { ListNode dummy = new ListNode(0); dummy.next=head; int length = 0; ListNode first=head; while (first != null) { length++; first = first.next; } length-=n; first=dummy; while (length > 0) { length--; first = first.next; } first.next = first.next.next; return dummy.next; } } class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }