code
/**
* 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* H = head;
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* fastptr = dummy;
ListNode* slowptr = dummy;
for(int i=0;i<=n;i++)
{
fastptr = fastptr->next;
}
ListNode* cur = fastptr;
while(cur!=nullptr)
{
cur = cur->next;
slowptr = slowptr->next;
}
ListNode* tmp = slowptr->next;
slowptr->next = slowptr->next->next;
delete tmp;
//return dummy->next;
return head;
}
};
测试用例是[1] 1或者[1,2,3] 3等当要删除的是表头的时候,return head就不能成功。但是使用return dummy->next的时候就可以成功。
原因就是head就代表表头指针,在代码中并没有体现指针对象head会随着删除节点而变化,所以head就绑定这表头节点,当我使用return head的时候。如果之前没有回收表头节点的内存,代码可以运行,但是测试用例[1] 1返回的是[1],并不是[]。
问题重点就是head指针指向原始链表的表头节点,方向不变