文章目录
- 引言
- 复习
- 新作
- 删除链表倒数第N个节点
- 题目描述
- 个人实现
- 参考实现
- 总结
引言
- 主管面,面的很凄惨,不过无所谓了,我已经尽力了。上午都在整理的面经,没有复习算法,而且这两天要弄一下论文,二十号就要提交了,可能都没有复习了,只有新作。
复习
- 这里是复习了昨天主管面的所有的问题,还有对应的算法题,不过由于结果还没出,要保密,这里就不说了。
新作
删除链表倒数第N个节点
题目描述
- 题目链接
个人实现
- 这道题典型的使用快慢指针来实现,不过两者是等间距的,前一个指针到了尾节点,后一个指针就到了倒数第n个节点。
- 有两个需要注意的地方
- 需要维持一个快慢指针之间的间距
- 需要找到倒数第n个指针的前一个指针,才能把倒数第n个指针删除
正常通过
具体实现代码
#include <iostream>
using namespace std;
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){};
ListNode(ListNode* t):val(-1),next(t){};
};
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode preHead = ListNode(-1,head);
ListNode* ahead = &preHead;
ListNode* back = &preHead;
int dist = 0;
while(back->next){
if (dist < n) back = back->next,dist ++;
else{
ahead = ahead->next;
back = back->next;
}
}
// 将对应指针删除
ahead->next = ahead->next->next;
// delete preHead;
return preHead.next;
}
int main(){
}
参考实现
- 他是完整遍历一遍,获取链表的长度,然后找倒数第n个指针,时间复杂度是一样,我这样写也是遍历了两次,没什么更快的。
- 我又愚蠢了,其实都是一样的,我那样写反而复杂了。
/**
* 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 k) {
auto dummy =new ListNode(-1);
dummy->next = head;
int n = 0;
for(auto p = dummy;p;p = p->next) n ++;
auto p = dummy;
for(int i = 0;i < n - k - 1;i ++) p = p->next;
p->next = p->next->next;
return dummy->next;
}
};
总结
- 今天的题目过得有点快,不往下做了。早点睡觉,背一下八股。