题目链接:
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
难度:中等
19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 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 n) {
auto a=head,b=head,pre=head;
while(n--){
a=a->next;
}
if(a!=nullptr){
while(a!=nullptr){
pre=b;
a=a->next;
b=b->next;
}
pre->next=b->next;
return head;
}else{
return head->next;
}
}
};
做完后看了下题解 思路是一样的 不过写法有点差别 其实应该是获取其前驱节点的 我这里的写法不太好 在重新写一下
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* node=new ListNode(0,head);
auto a=head,b=node;
while(n--){
a=a->next;
}
while(a!=nullptr){
a=a->next;
b=b->next;
}
b->next=b->next->next;
auto res=node->next;
delete(node);
return res;
}
};
当然 也可以使用其他方法 比如遍历两次 或者 使用栈 都可以
本文介绍了一种使用双指针技术在一次遍历内删除链表倒数第N个节点的方法。该方法首先移动一个指针N步,然后两个指针同步前进直到第一个指针到达链表尾部,此时第二个指针指向待删除节点的前一个节点。
395

被折叠的 条评论
为什么被折叠?



