题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
思路
双指针的一个典型应用
一开始看到倒数,我的思路就被带走到什么 链表长度-n = =
用双指针就很简单了,fast走n后,再让slow开始走,就是倒数啦(求倒数的一种应用
注意一下边界问题,重点就考虑只有一个节点啊这种极端情况,
模拟题画一下走一遍更清晰
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyhead =new ListNode();
dummyhead->next =head;
ListNode* fast =dummyhead;
ListNode* slow =dummyhead;
//双指针法,是fast、slow指针移动。不是->next移动。
//注意只有一个节点的时候的边界问题:fast!=NULL
while(n-- && fast!=NULL){
fast =fast->next;
}
while(fast->next !=nullptr){
slow =slow->next;
fast =fast->next;
}
ListNode* temp =slow->next;
slow->next =slow->next->next; //这里已经修改了头节点的next
delete temp;
//这里不能return head,因为可能删除的是第一个节点
return dummyhead->next;
}
};