这个题目其实比较简单,我们都知道怎么做。无非就是先让一个指针tail指向开头pre(初始为head)的后面的第n个位置,然后pre和tail同时向后移动,tail为空的时候,pre指向的就是要删除的节点。但是我却错了很多次,当然原因就是因为边界条件,即如果只有一个节点怎么办?如果删除的是第一个节点怎么办?然后考虑了还是错。但其实并没有考虑的那么复杂,只要涉及到需要改变头结点的题目,我们只需要再加一个头结点就行了,让链表变为带头结点的链表,这样就不用单独考虑第一个节点了。但要注意的是,此时pre指向的就不是要删除的节点,而是要删除节点的前一个节点。代码如下:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode NewHead = new ListNode(0);
NewHead.next = head; //添加一个头结点
ListNode pre = NewHead, tail = NewHead;
for (int i = 0; i < n; ++i) //tail指向后面第n个位置
tail = tail.next;
while(tail.next != null) { //pre和tail同时向后移动,直到tail不为空
pre = pre.next;
tail = tail.next;
}
//此时pre指向的是要删除节点的前一个节点,因为我们是从头结点初始化,而不是真正的第一个节点
pre.next = pre.next.next;
return NewHead.next;
}