【问题描述】
设有头结点单链表,删除单链表中倒数第k个结点。
【输入形式】
第一行输入若干个整数建立带头结点的单链表(以输入字符作为结束)。
第二行输入一个整数k,表示删除倒数第k个结点。
【输出形式】
输出删除后单链表的所有元素。
【样例输入1】
10 20 30 40 50 e
3
【样例输出1】
10 20 40 50
【样例输入2】
10 20 30 40 50 60 70 80 90 100 e
1
【样例输出2】
10 20 30 40 50 60 70 80 90
【样例输入3】
1 2 3 4 5 e
6
【样例输出3】
1 2 3 4 5
删除单链表倒数第K个元素:
题目依然利用单链表表的基本操作删除算法来实现。关键在于倒数第K个元素是正数第几个元素?如下图:
链表长度为5,结点9是倒数第2个元素,是正数第4个元素。即length-k+1
因此只需要求出链表长度,计算出元素位置,调用删除算法就可以了。
算法代码如下:
int deleteList(LinkList head, int pos ,ElemType *e)
{
if(pos<1)
{
return 0;
}
LNode* p=head;
int i;
for(i=1;i<pos&&p->next!=NULL;i++)p=p->next;
{
if(p->next==NULL||i>pos)
{
return 0;
}
LNode* q=p->next;
p->next=q->next;
free(q);
}
return 1;
}
//实现算法:删除倒数第k个结点
int deleteK(LinkList head,int k)
{
LNode* p=head;
int len=0;
while(p->next!=NULL)
{
p=p->next;
len++;
}
deleteList(head,len-k+1,NULL);
return 1;
}
最后只需要完成单链表的建立和输出
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList initList();
int insertList(LinkList head, int pos, ElemType e);
void printList(LinkList head);
int deleteList(LinkList head, int pos ,ElemType *e);
int deleteK(LinkList head,int k);
LinkList initList()
{
LNode* head;
head=(struct LNode*)malloc(sizeof(struct LNode));
if(!head)return NULL;
head->next=NULL;
return head;
}
int insertList(LinkList head, int pos, ElemType e)
{
if(pos<1)return 0;
LNode* p=head;
int i;
for(i=1;i<pos;i++)
{
if(p->next==NULL)return 0;
p=p->next;
}
LNode* pnew;
pnew=(LinkList)malloc(sizeof(LNode));
pnew->data=e;
pnew->next=p->next;
p->next=pnew;
return 1;
}
int deleteList(LinkList head, int pos ,ElemType *e)
{
if(pos<1)
{
return 0;
}
LNode* p=head;
int i;
for(i=1;i<pos&&p->next!=NULL;i++)p=p->next;
{
if(p->next==NULL||i>pos)
{
return 0;
}
LNode* q=p->next;
p->next=q->next;
free(q);
}
return 1;
}
void printList(LinkList head)
{
LNode* p=head;
while(p->next)
{
p=p->next;
printf("%d ",p->data);
}
return;
}
//实现算法:删除倒数第k个结点
int deleteK(LinkList head,int k)
{
LNode* p=head;
int len=0;
while(p->next!=NULL)
{
p=p->next;
len++;
}
deleteList(head,len-k+1,NULL);
return 1;
}
int main()
{
LinkList head;
ElemType e;
int k;
head=initList();
if(head)
{
//补充代码,输入若干个整数建立单链表
char c;int i=0,flag=1;e=0;
while(1)
{
c=getchar();
if(c>='0'&&c<='9')
{
e=e*10+(int)c-48;
flag=2;
}
else if(c=='-')flag=0;
else if(c=='\n'||c==' ')
{
if(!flag)e=e*(-1);
if(!flag&&e==0)break;
if(e!=0||flag==2)
{
insertList(head,i+1,e);
i++;
}
e=0;flag=1;
}
else break;
}
getchar();
scanf("%d",&k);
deleteK(head,k);
printList(head);
}
return 0;
}
运行结果如下: