19. 删除链表的倒数第N个节点
用两个指针,先打开间隔n,然后一起往后移动,这样就不用遍历两次了
中间做题过程中出现的问题在于没想到这个head节点是一个存有数据的节点,这使得我在调试过程中总是出现空指针的情况。
因此我自己设定一个虚指针(其实是看了下题解才领悟过来),指向第一个数据,然后再开始跑
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0,head);
ListNode* pleft=dummyHead;
ListNode* pright=dummyHead;
//先间隔了n个
for (int i = 0; i < n; i++)
{
pright = pright->next;
}
//同时往后遍历
while (pright->next != NULL)
{
pleft = pleft->next;
pright=pright->next;
}
//保存一下要删除的节点信息
ListNode* delNode=pleft->next;
//left指向的倒数n+1个节点
pleft->next = pleft->next->next;
//回收删除节点的内存
delete delNode;
//返回头
ListNode* ret=dummyHead->next;
delete dummyHead;
return ret;
}
};