中等难度的题,感觉做出来挺简单的 。
先遍历一遍链表,得到长度 length。
首先考虑一下特殊情况:
- 链表只有一个元素:此时根据数据范围可知,返回空即可;
- 删除的元素为倒数第length个,即第一个,此时返回head->next;
然后考虑普通情况,删除倒数第n个,我们找到倒数第n+1个,然后就是普通的删除节点问题了。
代码
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
ListNode *a = head;
ListNode *cur = head;
int len = 0;
while (cur != nullptr) {
cur = cur->next;
len++;
}
if (len == 1)
return nullptr;
if (n == len)
return a->next;
int k = len - n - 1;//因为是从第一个元素开始的,所以要减一。
cur = head;
while (k--) {
cur = cur->next;
}
ListNode *b = cur->next;
cur->next = cur->next->next;
delete b;
return a;
}
};