题目:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
题解:
方法一:一次遍历+双指针
函数代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head)
{
return head;
}
ListNode *p=new ListNode(0);
p->next=head;
ListNode *fast=head;
ListNode *slow=p;
for(int i=0;i<n;i++)
{
fast=fast->next;
}
while(fast)
{
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
return p->next;
}
};
函数代码二:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* header = new ListNode(0);
header->next = head;
ListNode* p = header;
ListNode* q = header;
for(int i = 0; i < n+1; i++)
p = p->next;
while(p != NULL){
p = p->next;
q = q->next;
}
q->next = q->next->next;
return header->next;
}
};
方法二:二次遍历+计算长度+虚拟头结点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head)
{
return head;
}
ListNode *dummy=new ListNode(0);
dummy->next=head;
ListNode *cur=head;
int len=0;
while(cur)
{
cur=cur->next;
len++;
}
cur=dummy;
for(int i=0;i<len-n;i++)
{
cur=cur->next;
}
cur->next=cur->next->next;
return dummy->next;
}
};