小mi粥的米 2021-10-28 10:50 采纳率: 72.7%
浏览 56
已结题

求链表的倒数第m个元素,看下面问题描述

如何设置两个指针和一个计数器,假设p和p1是指针,p2是计数器,P要遍历整个链表,那么,当p走过m的整数倍的时候,计数器P2清零,p1赋p的指针,p1是跳跃地向前进,当p走到头的时候呢,p1再走P2的计数个数。从而实现要求

  • 写回答

3条回答 默认 最新

  • 关注

    你的逻辑是错误的,假设链表中一个12个元素,你要找倒数第5个,走过两轮之后,p走到末尾,p2计数是2,p1指向第10个元素,p1再走2次不也到头了吗,怎么会是你要的元素呢?
    以你的逻辑的话,应该是p先走m步,用pt记录这个点,这时候p1不变,然后p再走m步,此时,让p1 等于pt,pt再次记录p的位置。当最后一次不足m步的时候,计数是p2,这时候,只需要让p1再走p2步,就是倒数第m个元素。
    代码如下,如有帮助,请帮忙采纳一下,谢谢。

    img

    #include <stdio.h>
    #include <stdlib.h>
    struct StNode 
    {
        int data;
        struct StNode* next;
    };
    //创建节点
    struct StNode* CreateNode(int d)
    {
        struct StNode* node = (struct StNode*)malloc(sizeof(struct StNode));;
        node->data = d;
        node->next = 0;
        return node;
    }
    //创建链表
    struct StNode* CreateList()
    {
        struct StNode* head,*p,*t;
        int data;
        head = 0;
        p = head;
        t = head;
        printf("创建链表,请输入链表数据:");;
        while(1)
        {
            scanf("%d",&data);
            t = CreateNode(data);
            if(head ==0)
            {
                head = t;
                p = head;
            }
            else
            {
                p->next = t;
                p = t;
            }
            if(getchar() == '\n') break;
        }
        return head;
    }
    //打印链表
    void Display(struct StNode* head)
    {
        while(head)
        {
            printf("%d ",head->data);
            head = head->next;
        }
        printf("\n");
    }
    
    struct StNode* GetNode(struct StNode* head,int m)
    {
        struct StNode *p1=0,*pt = 0,*p;
        int i,cnt = 1;
        p = head;
        p1 = head;
        
        while (p)
        {
            if(cnt !=0 && cnt%m == 0)
            {
                if(pt!=0)
                    p1 = pt;
                pt = p;
                cnt = 0;
                
            }
            cnt++;
            p = p->next;
        }
        
        if(pt==0) return 0; //说明链表长度不足m
        i=0;
        
        if(p1 == head) cnt--;
        while(i<cnt && p1)
        {
            i++;
            p1 = p1->next;
        }
        
        return p1;
    }
    
    
    int main()
    {
        struct StNode* list1 = CreateList();
        
        //打印链表
        Display(list1);
    
        struct StNode* p = GetNode(list1,2);//倒数第2个
        if(p)
            printf("倒数第2个:%d\n",p->data);
        else
            printf("没有那么多数据\n");
    
        p = GetNode(list1,5);//倒数第5个 
        if(p)
            printf("倒数第5个:%d\n",p->data);
        else
            printf("没有那么多数据\n");
    
        p = GetNode(list1,8);//倒数第8个 
        if(p)
            printf("倒数第8个:%d\n",p->data);
        else
            printf("没有那么多数据\n");
    
        p = GetNode(list1,15);//倒数第15个
        if(p)
            printf("倒数第15个:%d\n",p->data);
        else
            printf("没有那么多数据\n");
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月2日
  • 已采纳回答 4月24日
  • 创建了问题 10月28日

悬赏问题

  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失