给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

在本题中,如果我们要删除节点 yy,我们需要知道节点 yy 的前驱节点 xx,并将 xx 的指针指向 yy 的后继节点。
但由于头节点不存在前驱节点,因此我们需要在删除头节点时进行特殊判断。
但如果我们添加了哑节点,那么头节点的前驱节点就是哑节点本身,此时我们就只需要考虑通用的情况即可。
public class DeleteNthDesc {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head); //定义虚拟头头节点
        int length = getLength(head); //获取head链表的大小
        ListNode cur = dummy;
        //获取被删除节点的上一个节点【因为是删除倒数的节点,又因为是链表,所以我们必须从正面来】
        for (int i = 1; i < length - n + 1; ++i) {
            cur = cur.next;
        }
        cur.next = cur.next.next; //删除节点
        ListNode ans = dummy.next; //返回删除后的头结点链表
        return ans;
    }
    //获取链表大小
    public int getLength(ListNode head) {
        int length = 0;
        while (head != null) {
            ++length;
            head = head.next;
        }
        return length;
    }
}


class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}


版权声明:本文为pshdhx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。