通过定义指针,前后指针,前指针遍历到第n个结点,前后指针一起动。pre指针定义为头结点的前一个指针,防止头结点为空。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre=new ListNode(0);
pre.next=head;
ListNode start=pre,end=pre;
while(n!=0){
start=start.next;
n--;
}
while(start.next!=null){
end=end.next;
start=start.next;
}
end.next=end.next.next;
return pre.next;
}
}
因为要删除该节点,所以要移动到该节点的前一个才能删除,所以循环结束条件为 start.next != null
删除后返回 pre.next,为什么不直接返回 head 呢,因为 head 有可能是被删掉的点
时间复杂度:O(n)O(n)