/**
* 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) {}
* };
*/
//采用虚拟头结点和双指针
//假设我们要删除倒数第n个结点,我们可以选择两个指针,一个指向最后一个结点的下一个即空,一个指向倒数第你个结点的前一个结点,这两个指针之间有n个结点
//由于双指针,实际需要n+1个结点,但是链表可能本身只有n个节点,因此需要一个虚拟头结点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head==nullptr) return head;
ListNode*dummyHead=new ListNode(0,head);//虚拟头结点
ListNode*p=dummyHead;
ListNode*q=dummyHead;
while(n+1){
q=q->next;
n--;
}//先让两个指针相距n个节点
while(q!=nullptr){
p=p->next;
q=q->next;
}
p->next=p->next->next;
ListNode*ans=dummyHead->next;
delete dummyHead;
return ans;
}
};
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
最新推荐文章于 2024-05-09 00:11:26 发布