题目:
给定一个链表,删除链表的倒数第 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;
}
};

本文介绍了一种高效算法,用于解决链表中删除倒数第N个节点的问题,提供了两种方法:一次遍历加双指针法及二次遍历计算长度法,并附带详细的C++代码实现。
442

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



