删除单链表中倒是第K个结点

【问题描述】

设有头结点单链表,删除单链表中倒数第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;
}

运行结果如下:

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值