在本题中,如果我们要删除节点 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;
}
}