https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
/**
* 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:
int getLength(ListNode* head)
{
int i=0;
while(head) {i++; head=head->next;} //遍历到最后一个节点
return i;
}
ListNode* removeNthFromEnd(ListNode* head, int n) {
int length=getLength(head);
//创建头节点 注意这里添加哑结点的细节
//这里解释一下为什么要在head前创建一个新的节点,这样做可以避免讨论头结点被删除的情况,
//不管原来的head有没有被删除,直接返回dummy.next即可
ListNode *dummy=new ListNode(0,head);
ListNode * cur=dummy;
for(int i=1;i<length-n+1;i++)
{
cur=cur->next;
}
cur->next=cur->next->next;
ListNode *ans=dummy->next;
delete dummy ;
return ans;
}
};
收获:需要注意添加dummy头节点 这样不管原来的头节点有没有被删除都可以直接返回 dummy->next