1、描述
19、给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
2、关键字
链表、到数n
3、思路
双指针
4、note
链表常用技巧设置一个哑巴前置头节点,
语法:
ListNode* dumpNode=new ListNode(0,head); // 构造哑节点
特殊情况:链表为空!和链表长度不到 n
5、复杂度:
时间:O(N)
空间:O(1)
6、code
/**
* 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) {
if(head==nullptr) return nullptr; // 特例,空链表,链表长度小于n
auto b=head;
ListNode* dumpNode=new ListNode(0,head); // 构造哑节点
dumpNode->next=head;
auto a=dumpNode;
int k=0;
for(int i=0;i<n && b!=nullptr;i++){
b=b->next;
}
while(b!=nullptr){
a=a->next;
b=b->next;
}
a->next=a->next->next;
return dumpNode->next;
}
};