力扣19.删除倒数第n个元素
1.题目描述
给你一个链表,删除链表的倒数第 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]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
进阶:你能尝试使用一趟扫描实现吗?
2.解题思路
实际上还是双指针的应用,试想,设置两个指针p, q
,分别指向链表的头部,如果目标删除的是倒数第n个,那么让p先往前走n+1步,然后p,q
再一齐往前走,等到p走到链表的尽头停止,那么这个时候,q
的下一个元素就是我们目标要删除的元素。只需要p->next = p->next->next;
就可以实现删除倒数第n个元素的目的了。
思路比较简单,就不画图解释了。
直接是代码如下:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* p = new ListNode();
ListNode* q = new ListNode();
ListNode* listNode = new ListNode();
listNode->next = head;
p->next = listNode;
q->next = listNode;
int num = 0;
while(p->next != nullptr){
if(num >= n){
q = q->next;
}
p = p->next;
num++;
}
q->next = q->next->next;
return listNode->next;
}