NC53_删除链表的倒数第n个节点
知识点:链表
题目链接
题目描述
给定一个链表,删除链表的倒数第n个节点并返回链表的头指针
例如,
给出的链表为:1->2->3->4->5, n= 2.
删除了链表的倒数第n个节点之后,链表变为1->2->3->5.
备注:
题目保证n一定是有效的
请给出请给出时间复杂度为O(n)的算法
示例1
输入:{1,2},2
输出: 2
解题思路
- 如何定位到倒数第n个结点比较简单 可以采用快慢指针 快指针先跑
- 但是这里需要删除 我们要定位到倒数n个节点的前面一个 也就是倒数n+1个结点
- 此外我们要注意如果删除的是 头结点
- 我们可以添加一个哨兵节点 放到head前面 然后还是找到倒数第n个结点 实际上 找到的是倒数n+1个节点
- 把这个结点的后面那个节点删除
- 最后返回哨兵结点的后面 能很好的处理删除头节点的问题
代码
#include "cheader.h"
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x):val(x){}
};
class Solution {
public:
ListNode *removeNthFromEnd(ListNode *head, int n) {
if(head == NULL)
return head;
ListNode* node = new ListNode(-1);
node->next = head;
ListNode* fast = node;
ListNode* cur = node;
while(n--)
fast = fast-> next;
while(fast->next){
cur = cur->next;
fast = fast->next;
}
cur->next = cur->next->next;
return node->next;
}
};
int main()
{
ListNode* head = new ListNode(1);ListNode* node = new ListNode(2);
head->next = node;
Solution s;
ListNode* newhead = s.removeNthFromEnd(head, 2);
while(newhead != nullptr){
cout<<newhead->val<<endl;
newhead = newhead->next;
}
return 0;
}
今天也是爱zz的一天!