给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
思路:
1.先让end指针向前走(n-1),这样的话就可以让end和first之间出现(n-1)的间隔,
2.让end和first一起向后走,直到end到头了,此时first就是倒数第n个数
3.再让temp走到first之前,用(temp->next=first->next;)来跳过first,再释放first,
4.代码中考虑了集中极端的情况。
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
}; ListNode* createlist(int n)
{
ListNode *head = (ListNode*)malloc(sizeof(ListNode));
ListNode *pre = head;
for (int i = ; i < n; i++)
{
ListNode *p = (ListNode*)malloc(sizeof(ListNode));
cin >> p->val;
pre->next = p;
pre = p;
}
pre->next = nullptr;
return head;
} ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *temp=head;
ListNode *first=head;
ListNode *end=head;
if((temp->next)==nullptr) return nullptr;
if(n==)
{
while(end->next->next!= nullptr)
{
end=end->next;
}
temp=end->next;
temp=nullptr;
free(temp);
end->next=nullptr;
return head;
} while((n-)!=)
{
n--;
end=end->next;
}
//cout<<end->val<<endl;
while(end->next!= nullptr)
{
first=first->next;
end=end->next;
}
if(temp==first) return first->next;
//cout<<"first"<<first->val<<endl;
//cout<<end->val<<endl;
while((temp->next!=first))
{
temp=temp->next;
}
//cout<<temp->val<<endl;
temp->next=first->next;
first=nullptr;
free(first);
return head;
} int main() {
ListNode* head=createlist();
ListNode *ans=removeNthFromEnd(head,);
ans=ans->next;
while(ans!= nullptr)
{
cout<<ans->val<<endl;
ans=ans->next;
}
return ;
}