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

83 阅读1分钟
/**
 * 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 p=head,q=head;
        // 记录链表长度
        int size=0;
        // 求链表长度
        while(p!=null){
            size++;
            p=p.next;
        }
        // 除去第一个结点的时候
        /*
        易错点:
        下面的
        int t=size-n
        t代表的是要删除的结点前面有几个结点,
        而该链表head没有头结点
        故前面有0个结点
        要单独拿出来讨论
        */
        if(size==n){
            return head.next;
        }
        // 记录删除结点的前一个结点的正数位置
        int t=size-n;
        int i=1;
        // 找要删除的结点的前一个结点
        while(i!=t){
            q=q.next;
            i++;
        }
        // 删除结点
        q.next=q.next.next;
        return head;
    }
}