单链表倒数第K个节点的查找和显示

最近在学回顾之前学到的知识,正好碰到了关于链表查找的一道面试题,在此贴出来,与小伙伴们共同交流~

在刚看到题目,其实很容易就想到一个方法,就是先求链表的长度(length),然后去超找第length-k+1个节点的值,再进行查找,先贴代码如下。

#include <stdio.h>
#include <malloc.h>
/*链表节点结构*/
typedef struct node{int data;struct node * pNext;
}NODE,*PNODE;
/*函数声明*/
PNODE create_list();
void show_list(PNODE p);
void show_list_list(PNODE p);
int serch_k(PNODE p,int k);
/*主函数*/
int main(){int k;int len;PNODE pHead=NULL;pHead=create_list();show_list(pHead);len=show_list_length(pHead);printf("\n%d",len);k=serch_k(pHead,2);//查找倒数第K个值printf("\n%d",k);return 0;
}
/*生产链表*/
PNODE create_list(void){int len;int val;int i;scanf("%d\n",&len);PNODE pHead=(PNODE)malloc(sizeof(NODE));if(pHead==NULL){printf("error");}PNODE pTail=pHead;pTail->pNext=NULL;for(i=0;i<len;i++){scanf("%d",&val);PNODE pNew=(PNODE)malloc(sizeof(NODE));if(pNew==NULL){printf("error");}pNew->data=val;pTail->pNext=pNew;pNew->pNext=NULL;pTail=pNew;}return pHead;
}
/*显示链表*/
void show_list(PNODE p){PNODE p1=p->pNext;if(p1==NULL){printf("error");}while(p1){printf("%d",p1->data);p1=p1->pNext;}
}
/*显示链表长度*/
int show_list_length(PNODE p){int count=0;PNODE p1=p->pNext;if(p1==NULL){printf("error");}while(p1){count++;p1=p1->pNext;}return count;
}
/*查找第k个节点的值*/
int serch_k(PNODE p,int k){
int i=0;PNODE p1=p; int len=show_list_length(p);if(k>len){printf("error");}/*循环len-k+1次*/for(i=0;i<len-k+1;i++){p1=p1->pNext;}return p1->data;
}    

这个算法需要对链表进行两次遍历,导致时间复杂度为O(N^2),那有没有只需要一次遍历的呢,答案是有的。

首先先看下思路:p1和p2分别都是head指针,先将p2向右移动k次,如图2所示

 

图1

图2

这时候,只需要继续保持p1和p2等间距的右移,当p2的next为null,则证明p1所指的结点的值为倒数第k个节点的值

图3

这就是一次遍历找出倒数第k个节点的值,其时间复杂度为O(N)

具体代码如下所示

int serch_k(PNODE p,int k){int i;PNODE p1 = p;PNODE p2 = p;for (i = 0; i < k; i++) {p2 = p2->pNext;}while (p2 != NULL) {p1 = p1->pNext;p2 = p2->pNext;}return p1->data;
}

这是测试结果

 

图4

这就是单链表找倒数第k个结点的值的两种方法。

单链表倒数第K个节点的查找和显示相关推荐

  1. 链表之删除单链表倒数第K个节点

    删除单链表倒数第K个节点 题目: 删除单链表中倒数第K个节点, 思路:             给我们一个单链表,我们需要删除倒数第K个节点,比如链表每个节点值是1.2.3.4.5.6     K值是 ...

  2. c语言求单链表倒数第k个节点,链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解析 设置两个指针,一个遍历链表到第k-1个结点,第二个再开始遍历,直到遍历到链表的最后一个结点,那么第二个指针指向的,就是倒数第k个结点. Ja ...

  3. 链表之删除双链表倒数第K个节点

    链表之删除双链表倒数第K个节点 题目: 链表之删除双链表倒数第K个节点   思路: 之前写过 http://blog.csdn.net/u011068702/article/details/50280 ...

  4. c++链表获取长度,链表翻转,查找链表倒数第K个节点以及中间点

    c++链表获取长度,链表翻转, 查找链表倒数第K个节点以及中间点 测试数据 ListNode* pHead = new ListNode();pHead->m_key = 1;ListNode* ...

  5. 数据结构与算法-单链表的常见面试题(单链表的长度,单链表倒数第k个数据)

    单链表的长度,单链表倒数第k个数据 求单链表中节点的个数 思路分析 完整代码 查找单链表中倒数第k个节点 思路如下: 全量代码 求单链表中节点的个数 在上一节代码的基础上我们来学习 思路分析 我们创建 ...

  6. 左神算法:将单链表的每K个节点之间逆序(Java版)

    本题来自左神<程序员代码面试指南>"将单链表的每K个节点之间逆序"题目. 题目 给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K 个节点之间逆序,如果 ...

  7. java链表的输出_Java输出链表倒数第k个节点

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  8. 剑指Offer之寻找链表倒数第k个节点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 代码及解析 用的快慢指针的思路 public class FindKthValue {static public class ListNode { ...

  9. python 链表倒数第k个节点_链表-删除单链表中倒数第k个节点

    题目 实现一个函数,一个可以删除单链表中倒数第k个节点 难度 简单 分析 本题比较简单,实现方法多种多样,这里提供一种方法 首先明确一点,在单链表中删除倒数第k个节点,需要找到他的前一个节点,让前一个 ...

最新文章

  1. R语言将多个dataframe导出到excel的多个表单(sheet)实战
  2. 7.pip工具的使用
  3. python写文件读文件-python--文件流读写
  4. 按键控制LED实现启动、停止按钮
  5. 奇怪吸引子---Chua
  6. Apple开发者账号申请学习方式
  7. jsp超链接中怎么跳转页面跳转页面_在页面点击超链接跳到别的页面,方法是什么?...
  8. 编写高效的PyTorch代码技巧(上)
  9. 喜讯,Asp.net Ajax 文档提供下载
  10. 牛客寒假算法基础集训营2 A处女座的签到题
  11. curl请求命令url加引号
  12. mybatis配置log4j控制台打印SQL语句
  13. 父窗体与子窗体之间的调用-使用模态窗体之间传递多个值
  14. MetadataReader、ClassMetadata、AnnotationMetadata的简单使用
  15. 成功解决 XXX--1.0-SNAPSHOT.jar中没有主清单属性
  16. 百度自动php推送蜘蛛怎么不来访问,使用代码向百度蜘蛛主动推送链接
  17. cocos2dx 游戏中内存优化
  18. 自定义View-仿QQ运动步数进度效果(完整代码)
  19. 三年程序员生涯的感悟、总结和憧憬
  20. 稳定获取Android设备唯一码(UUID)的解决方案

热门文章

  1. Java基础:JavaNIO 之 内存映射文件原理
  2. linux x下载工具,Linux下强大的Axel下载工具
  3. loj.ac:#10024. 「一本通 1.3 练习 3」质数方阵
  4. 不同版本Eclipse对JDK版本要求
  5. java学习-http中get请求的非ascii参数如何编码解码探讨
  6. Spring Boot 学习系列(09)—自定义Bean的顺序加载
  7. 304 Not Modified
  8. CleanAOP实战系列--WPF中MVVM自动更新
  9. 01-1. 最大子列和问题
  10. Linux驱动开发环境配置(内核源码树构造)