第一次错误
如果first为空则second正好指向倒数第n个,无法进行删除。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *first = head;
ListNode *second = head;
while(n--){
first = first->next;
}
while(first){
first = first->next;
second = second->next;
}
//删除second的下一个
ListNode *temp = second->next;
second->next = second->next->next;
delete temp;
return head;
}
};
第二次错误
确实会停在倒数第n+1个,但是如果为空,first->next会访问空指针的next,执行出错,如果不特殊处理的话一定需要 虚拟头节点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *first = head;
ListNode *second = head;
while(n--){
first = first->next;
}
while(first->next!=nullptr){
first = first->next;
second = second->next;
}
//删除second的下一个
ListNode *temp = second->next;
second->next = second->next->next;
//delete temp;
return head;
}
};
改正版本,加上虚拟头节点就可以了
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode *first = dummyHead;
ListNode *second = dummyHead;
while(n--){
first = first->next;
}
while(first->next!=nullptr){ //在first为空的时候,first->next会造成执行出错
first = first->next;
second = second->next;
}
//删除second的下一个
ListNode *temp = second->next;
second->next = second->next->next;
delete temp;
head = dummyHead->next;
return head;
}
};