饭不食,水不饮,题必须刷
C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?先看简单题! 《C语言入门100例》
数据结构难?不存在的! 《数据结构入门》
LeetCode 太简单?算法学起来! 《夜深人静写算法》
给你一个链表,删除链表的倒数第 n n n 个结点,并且返回链表的头结点。
样例输入: h e a d = [ 1 , 2 , 3 , 4 , 5 , 6 ] head = [1,2,3,4,5,6] head=[1,2,3,4,5,6], n = 5 n = 5 n=5
样例输出: [ 1 , 3 , 4 , 5 , 6 ] [1,3,4,5,6] [1,3,4,5,6]
/**
* 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) {
}
};
ListNode
;val
和指针域next
。LeetCode 19. 删除链表的倒数第 N 个结点
我们采用数学归纳法:
如果删除的是倒数第 1 1 1 个,则删除数组的第 L − 1 L-1 L−1 个元素,再把原数组组织成链表;
如果删除的是倒数第 2 2 2 个,则删除数组的第 L − 2 L-2 L−2 个元素,再把原数组组织成链表;
如果删除的是倒数第 3 3 3 个,则删除数组的第 L − 3 L-3 L−3 个元素,再把原数组组织成链表;
…
如果删除的是倒数第 L L L 个,则删除数组的第 0 个链表节点,再把原数组组织成链表;
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
vector <ListNode*> nodes;
ListNode *now = head;
while(now) {
nodes.push_back(now); // (1)
now = now->next;
}
if(n == nodes.size()) {
head = head->next; // (2)
}else {
ListNode *last = head;
for(int i = 1; i < nodes.size(); ++i) {
if(i == nodes.size() - n) {
continue; // (3)
}
last->next = nodes[i]; // (4)
last = nodes[i];
}
last->next = NULL;
}
return head;
}
};
next
即可;last
代表当前链表最后一个元素;链表问题如果在时间复杂度允许的情况下,是可以用数组来代替的;