使用c++ 实现删除链表的倒数第n个节点
ListNode *removeNthAFromEnd(ListNode *head,int n)
{
ListNode *dummy=new ListNode(0);
dummy->next=head;
ListNode *front=head;
ListNode *back=dummy;
for (size_t i = 0; i < n; i++)
{
/* code */
front=front->next;
}
while (front!=nullptr)
{
front=front->next;
back=back->next;
/* code */
}
back->next=back->next->next;
return dummy->next;
}
将剑指offer中的java代码改写为c++,使用双指针实现,并使用哨兵节点减少条件判断,实现删除链表表头。完成代码为
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;
struct ListNode
{
int value;
ListNode *next;
ListNode():value(0),next(nullptr){};
ListNode(int x):value(x),next(nullptr){};
/* data */
};
ListNode *init(int count)
{
ListNode *head=new ListNode(0);
ListNode *node=head;
for (size_t i = 1; i < count; i++)
{
ListNode *_node=new ListNode(i);
node->next=_node;
node=_node;
}
node->next=nullptr;
return head;
}
bool show(ListNode *head)
{
ListNode *node=head;
if (node==nullptr)
{
return false;
}
while (node!=nullptr)
{
cout<<node->value<<endl;
node=node->next;
/* code */
}
return true;
}
ListNode *removeNthAFromEnd(ListNode *head,int n)
{
ListNode *dummy=new ListNode(0);
dummy->next=head;
ListNode *front=head;
ListNode *back=dummy;
for (size_t i = 0; i < n; i++)
{
/* code */
front=front->next;
}
while (front!=nullptr)
{
front=front->next;
back=back->next;
/* code */
}
back->next=back->next->next;
return dummy->next;
}
int main()
{
ListNode *head=init(6);
show(head);
ListNode *_head=removeNthAFromEnd(head,6);
show(_head);
}