解题思路:利用双指针,指针node2先走N个值,然后循环当node2->next!=nullptr时,node1循环向后移动,当node2位于链表最后一位时,node1就是要删除节点的前一个,直接让node1->next=node1->next->next,即可
需要注意的地方:当node2移动N个值后已经是空指针时,则n==1,则说明链表只有一个元素,n!=1,则说明删除的是第一个元素,这两种情况要分开讨论
代码:
/**
* 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* node1=head,*node2=head;
for(int i=0;i<n&&node2!=nullptr;i++){
node2=node2->next;
}
if(node2==nullptr){
if(n==1){
return node1=nullptr;
}
else{
return node1=node1->next;
}
}
while(node2->next!=NULL){
node2=node2->next;
node1=node1->next;
}
node1->next=node1->next->next;
return head;
}
};