题目:
?
给你一个链表,删除链表的倒数第?n ?个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1 输出:[]
示例 3:
输入:head = [1,2], n = 1 输出:[1]
思路:
遇到删除链表倒数第n个节点这种题目,我认为比较好的方法应该是双指针。不过在这其中也需要用到一个知识点,就是虚拟节点的知识。用到虚拟节点是因为删除节点还存在着删除实际头结点这种情况,不过,因为虚拟节点需要申请内存空间,所以最后在代码结束部分需要删除虚拟节点,释放已申请的内存空间。
分成以下几步:
代码实现部分:
用c++写的,
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* node=new ListNode(0,head);//虚拟节点
ListNode* slow=node;
ListNode* fast=node;
while(n--&&fast!=nullptr){
fast=fast->next;//先让fast指针先走n步
}
fast=fast->next;//fast指针指向第(n+1)个节点,走了(n+1)步
while(fast!=nullptr){//目的是让fast指针指向最后一个节点的next,即nullptr,此时slow指针同时移动,最后所指向的节点的next,其代表的节点就是要删除的节点
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
ListNode* ans=node->next;
delete node;//释放申请的虚拟节点所占用的空间
return ans;
}
};
|