双指针

pre靠前,qtr靠后。当qtr到末尾,pre的下一个元素即为需要删除元素。

为了保证操作统一,需要加入一个虚拟节点。

public ListNode removeNthFromEnd (ListNode head, int n) {
    // write code here
    ListNode dummyNode = new ListNode(0);
    dummyNode.next = head;
    ListNode pre = dummyNode, qtr = dummyNode;
    while(qtr != null && n > 0){
        qtr = qtr.next;
        n--;
    }
    while(qtr != null && qtr.next != null){
        pre = pre.next;
        qtr = qtr.next;
    }
    pre.next = pre.next.next;
    return dummyNode.next;
}