题目描述:
题源:LeetCode
思路:
使用双指针:两个指针left、right同时指向头结点,然后让right向后移动n个位置,即指向链表的第n+1个元素,此时出现两种情况:①第n+1个元素为空,即链表一共有n个元素,删除倒数第n个元素即为删除第一个元素,返回头结点的下一个节点指针即可。②第n+1个元素不为空,同时后移left、right指针,直到right指向最后一个元素,此处left指向要删除的第n个元素的前一个元素,删除该元素的后一个元素,即left->next=left->next->next;返回头结点。
代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *left=head;
ListNode *right=head;
for(int i=0;i<n;i++){
right=right->next;
}
if(right==NULL) return head->next;//当一共有n个元素并删除倒数第n个元素的情形,即删除第一个即可
while(right->next!=NULL){
left=left->next;
right=right->next;
}
left->next=left->next->next;
return head;
}
};