19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n **个结点,并且返回链表的头结点。
示例 1:
输入: head = [1,2,3,4,5], n = 2
输出: [1,2,3,5]
示例 2:
输入: head = [1], n = 1
输出: []
示例 3:
输入: head = [1,2], n = 1
输出: [1]
方法一:计数
思路:
1、额定链表长度
2、寻找要删除结点的前一个结点
3、进行删除操作
4、边界处理:可以添加虚拟头结点,也可以当独对链表只有一个结点或要删除结点为第一个结点处理
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
int cnt=0,s;
ListNode *p=head;
while(p){
p=p->next;
cnt++;
}
if(cnt==1){
return nullptr;
}
if(cnt==n){
return head->next;
}
p=head;
s=cnt-n;
while(--s){
p=p->next;
}
p->next=p->next->next;
return head;
}
};
方法二:双指针
思路:
1、指针p、q指向头结点
2、移动q,使q与p之间有n个结点
3、同时向后移动p、q,当q为空时停止移动,此时p指向的结点便是待删除结点的前一个节点
4、进行删除操作
5、边界处理,同方法一
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummyhead=new ListNode(0,head);
ListNode *p=dummyhead,*q=dummyhead;
++n;
while(n--){
q=q->next;
}
while(q){
p=p->next;
q=q->next;
}
p->next=p->next->next;
return dummyhead->next;
}
};