难度:中等
目录
一、问题描述
二、思路
1、解题思路
2、极端情况判断
3、解决极端情况
三、解题
1、代码实现
2、时间复杂度 and 空间复杂度
四、总结
这里直接采用的是LeetCode上面的问题描述。
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
下面给出示例:
提示:
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
我们要想在链表中删除一个结点,目的就是要找到这个结点的前面一个节点(记为 left )。这里通过遍历链表 head 来计算链表的长度 ListSize ,然后通过 ListSize - n 来确定 结点 left 是链表中的第几个结点。通过 for循环遍历到 结点left 上,然后将要删除的结点的 next域 赋给 结点left的next域 即可。
1 <= n <= ListSize
,所以当 ListSize == 1 时,直接返回 NULL。/**
* 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) {
int ListSize = 0;
ListNode *p = head;
while(p){
p = p->next;
ListSize++;
}
delete(p);
if(ListSize < 2){
return NULL;
}
if(ListSize == n){
return head->next;
}
ListNode * ans = head;
for(int i = 1;i < ListSize-n;i++){
head = head->next;
}
head->next = head->next->next;
return ans;
}
};
时间复杂度: ,n 为链表长度。
空间复杂度:
这题没有什么好说的,看清楚提示,注意细节,就可以了。
如果对你有什么帮助,请star ♥ 一下,收藏一下,蟹蟹啦!