【算法百题之五十一】删除链表的第n个结点
大家好,我是Lampard~~
很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙!
今天的问题是:删除链表的第n个结点
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
思路:要求时间复杂度为log(n),那我们就用空间换时间,使用向量把读到的结点存起来
结点结构:
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) {}
};
算法代码:
要注意两个特殊情况,一个是要删除的长度大于链表长度则不用操作,若刚好相等则返回第二个节点即可。
ListNode* removeNthFromEnd(ListNode* head, int n) {
vector<ListNode*> list2Vec;
ListNode *curNode = head;
while (curNode != nullptr) {
list2Vec.push_back(curNode);
curNode = curNode->next;
}
int length = list2Vec.size();
if (n > length) return head;
if (n == length) return head->next;
list2Vec[length - 1 - n]->next = list2Vec[length - n]->next;
return head;
}
测试结果: