给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
Code: 递归法
class Solution {
public:
int cur=0;
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head) return NULL;
head->next = removeNthFromEnd(head->next,n);
cur++;
if(n==cur) return head->next;
return head;
}
};
Code: 双指针法
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
// 快慢双指针法
ListNode *p = head, *q = head;
while(n>0){q=q->next;n--;} // 让快指针q先跑n个
if(q==NULL){return head->next;} // q跑到头NULL说明删除的是头结点,用头结点的下一个作为返回值即可
while(q->next!=NULL){p = p->next; q = q->next;} // 快慢指针一起跑,当快指针到尾结点时停止
p->next = p->next->next; //此时p指针为要删除的结点的前一个结点
return head;
}
};