题解 | #输出单向链表中倒数第k个结点#

输出单向链表中倒数第k个结点

http://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d

链表的结构真恶心啊。

我一个只学过一点点C的人就嗯模仿,数据流转使人死亡。

笑死了,连定义头指针都不会。

这道题没什么难点,如果前面的题目都刷了,这就是一个简单的寻址问题。

处理数组的思想完全可以套用在这。

就是链表的调用费了许多时间。

创建链表每次只能增加一个结点(即写入一个数据指向下一个位置),属实难顶。(我说的可能不对,因为之前没有学过,所以是从代码中推测的,)

插入移动也每次只能移动一个,这一点和数组的去重操作有一些相似之处。

不要忘记释放内存。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int N,val;
int count=0;
int k=0;


struct  list_node//创建链表结构
{
	int m_nKey ; 
	struct list_node *m_pNext ;
};
 
typedef struct list_node list_single ; 	


list_single *create_list_node(int data)//创建链表和结点
{
	list_single *node = NULL ;//定义头指针
	node = (list_single *)malloc(sizeof(list_single));//分配内存空间
	if(node == NULL){
		printf("malloc fair!\n");
	}
	memset(node,0,sizeof(list_single));//reset
	node->m_nKey = data;//给链表结点数据赋值
	node->m_pNext = NULL ;//链表指针域指向空
  //  free(node);
	return node ;
}

list_single *tailnode(list_single* headNote,int m_nKey)//尾插结点
{
    list_single *new_node=create_list_node(m_nKey);//将要尾插的新链表结构
    
    list_single *insert_pMove=headNote;//获取当前结点位置,访问头结点
    
    while(insert_pMove->m_pNext != NULL)//判断是否为最后一个结点
    {
        insert_pMove = insert_pMove->m_pNext;//如果不是,移动到下一个结点
    }
    
    
    insert_pMove->m_pNext = new_node;//如果是,将数据插入尾部
    
    count++;//尾插1,结点加一
    
    return 0;
    
}


/*list_single *fowardnode(list_single* headNote,int m_nKey)//头插结点
{
    list_single *new_node=create_list_node(m_nKey);//将要尾插的新链表结构
    
    list_single *head_pMove=headNote;//获取当前结点位置,访问头结点
       
    new_node->m_pNext  = head_pMove->m_pNext;//将新结点的下一个结点设置为原来结点的下一个结点
    
    head_pMove->m_pNext = new_node;//原来的头结点的下一个结点设置为新插入的头结点
    
}*/



list_single *findnode(list_single* headNode, int k)//寻找倒数第k结点
{
     list_single *find_pMove= headNode;//确定搜索开始的位置
    if(count>=k)
    {
        
     for(int i=0;i<(count-k+1);i++)//一直搜寻到倒数第k个
         
     {   
         
      find_pMove = find_pMove->m_pNext;    //如果没搜到边界,链表指向下一个位置。      
     
     }  
        
      return find_pMove->m_nKey;  //返回链表中的值
    }
    
    else                //没有或者长度不够则返回NULL
        return NULL;
    
}






int main(void)
{
  list_single* headNode=create_list_node(N);//创建头结点
  while((scanf("%d\n",&N))!=EOF)
  {
   
    for(int i=0;i<N;i++)
    {
        
        scanf("%d \n",&val);//每次收入一个数据写入链表
        tailnode(headNode,val);//每次将新收入的数据尾插
    }
    
    scanf("%d\n",&k);
    printf("%d\n",findnode(headNode, k));//检索倒数第k个数据并输出
      
  }
    free(headNode);
}




全部评论

相关推荐

2025-12-12 19:58
哔哩哔哩_产品运营
跟同事聊天时候,同事说“你刚来时候blabla”,突然意识到自己已经正式工作一年多了!就这么从脆皮内耗大学生逐渐磨练成厚血条(厚脸皮)工位主理人。秋招简历当然也是投了不少份,但总有一些机会要留给自己的白月光,比如阿B,说说我秋招选择阿B的理由吧:1.&nbsp;“为爱发电”:说来兴趣真的是初心,阿B在手机陪我看了那么多番剧vlog学习视频,当然想和它距离更近一些。来了之后发现,B站重要活动要专门走内宣是有原因的,身边的六级大佬绝对不在少数。2.&nbsp;实习体验感拉满:嗯对其实等不到正式工作就先来实习体验了。实习期在一个非常好的组,大家都很年轻氛围超好,做事情讲背景、讲逻辑不会只丢脏活累活。平时聊得来,工作起来也能快速打配合,项目完成时候所有人都成就感满满。再说说来正式工作之后的体验感:1.&nbsp;校招生mentor文化很需要:在阿B每个校招生入职都是会有一位mentor的,不会让大家有刚工作人生地不熟就孤苦一人挑大梁的感觉。很幸运我的mt人真的超好,耐心温柔业务能力又很强。常常在对需求听她帮我说话时看着她身上闪耀的光芒想要流泪。有mt的话landing期会顺畅很多。公司也会安排一些活动帮助mentor和mentee增进感情。2.小动物们和各类活动是回血剂:工作起来当然难免遇到一些磕磕磨磨,但是压力大时候转头看到想悄悄溜过的小猫摸上一把,真的会治愈不少。还有节假日的各种活动和扫楼活动,真的会给上班增加动力。最后上图!没有任何工作会让人一直开心吧,但阿B你在照顾员工心情这一块儿做得真的很不错。
哔哩哔哩公司福利 904人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务