
方法一:通过数组删除
ListNode* removeNthFromEnd(ListNode* head, int n) {
// 数组保存所有节点
vector<ListNode *> vect = {head};
while(nullptr != vect.back()->next)
vect.push_back(vect.back()->next);
int iTotal = vect.size();
// 如果总节点只有一个,那么返回空
if(1 == iTotal || 0 == iTotal )
return nullptr;
// 如果删除数 等于 总数,说明删除第一个节点,返回第二个节点
else if(iTotal == n)
return head->next;
// 如果等于1说明删除最后一个
else if(1 == n)
vect[iTotal - 2]->next = nullptr;
else
{
// 取到要移除的指针位置
if(nullptr != vect[iTotal - n]->next)
vect[iTotal - n - 1]->next = vect[iTotal - n - 1]->next->next;
}
return head;
}
方法二:快慢指针
ListNode* removeNthFromEnd(ListNode* head, int n) {
// 判断是否为空或者只有一个节点,如果是,那么返回空
if(!head && !head->next)
return nullptr;
ListNode *fast = head, *slow = head;
for(int i = 0; i < n; ++i)
{
fast = fast->next;
}
// 如果快指针已移到最后,说明删除第一个指针,返回第二个结点
if(nullptr == fast)
return head->next;
// 快指针移动到最后,此时慢指针正好移动到要删除位置的前一个
while(nullptr != fast->next)
{
fast = fast->next;
slow = slow->next;
}
// 修改当前结点的下一个结点
slow->next = slow->next->next;
return head;
}