题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
答案
class Solution{
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head==nullptr || head->next==nullptr) return nullptr;
ListNode *pre = new ListNode(0);
pre->next = head;
ListNode *fast = pre;
ListNode *slow = pre;
while(n){
fast = fast->next;
n--;
}
while(fast->next){
slow = slow->next;
fast = fast->next;
}
ListNode *del = slow->next;
if(del == head) return head->next;//之前少了这一行
slow->next = del->next;
delete del;
return head;
}
};
WA分析
之前一直在报错,错在n长的链表删掉倒数第n个时的情况,是忘了考虑删掉的结点可能是head结点,于是加上了这行if(del == head) return head->next;就可以了。
快慢指针
这条题目主要用到的是快慢指针这个思想,还有些题目可以用快慢指针,比如判断一个链表是否有环等。