本题比较简单,主要考察了单链表的创建与删除。
但是有一个问题需要着重的考虑,如何快速定位链表的倒数第n个节点。这就需要两个辅助节点,一个节点先走到正数第n个位置,然后两个辅助节点一块往后走,最后后面的节点的位置就是我们需要的倒数第n个节点。
#include<stdio.h>
#include<stdlib.h>
struct ListNode//定义节点
{
int value;
struct ListNode *next;
};
ListNode *removeNthFromEnd(ListNode *head,int n)
{
ListNode *p=head;//前面开始走的节点
ListNode *q=head;//后面跟着走的节点
while(p!=NULL)
{
p=p->next;
if(n--<0)
q=q->next;//让q节点走到可以删除的位置
}
if(n==0)//表示就从开头开始删除
head=head->next;
else//正常的位置删除节点
q->next=q->next->next;
return head;
}
int main()
{
int n,m;
while(scanf("%d",&m)!=EOF)
{
ListNode *head=(ListNode*)malloc(sizeof(ListNode));
head->next=NULL;
head->value=0;
ListNode *p=head;
for(int i=0;i<m;i++)
{
int tmp_value;
ListNode *tmp_node=(ListNode*)malloc(sizeof(ListNode));
scanf("%d",&tmp_value);
tmp_node->value=tmp_value;
tmp_node->next=NULL;
p->next=tmp_node;
p=tmp_node;
}
scanf("%d",&n);
ListNode*h=removeNthFromEnd(head,n);
while(h->next)
{
h=h->next;
printf("%d ",h->value);
}
}
return 0;
}