查找单链表的倒数第k个值
刚开始,我想到的是一种笨方法,先遍历单链表,计算出单链表的长度len,然后再从头遍历单链表到第len-k个节点,那么
这个节点既是单链表的倒数第k个节点。
不过这种算法时间复杂度挺高的,还有一种更简单的方法,就是设置两个指针,分别指向单链表的头节点,然后让其中一个指针,先走k步,
之后,再让两个指针同时走,直到第一个指针走到单链表尾节点结束。
那么,第二个指针所指向的节点,就是倒数第k个节点。
代码如下:
#include <iostream>
#include <cstdlib> using namespace std; typedef struct list{
int data;
struct list *next;
}list_node,*listNode; void createList(listNode &list,int arr[],int n)
{
int i;
listNode temp;
for(i=0;i<n;i++)
{
temp=(list_node*)malloc(sizeof(list_node)); //为节点分配内存
if(temp)
{
temp->data=arr[i];
temp->next=NULL;
temp->next=list->next;
list->next=temp;
}
else
{
cout<<"内存分配失败"<<endl;
} }
}
/**
查找倒数第k个节点
*/
int find_knode(listNode list,int k)
{
if(list==NULL||k<0)
{
cout<<"链表不能为空或k值不能小于0"<<endl;
return 0;
}
listNode first;
listNode second;
int i=0;
first=list->next;
second=list->next;
while(i<k)
{
first=first->next;
i++;
}
if(first==NULL)
{
cout<<"链表长度小于k"<<endl;
return -1;
}
while(first)
{
first=first->next;
second=second->next;
}
return second->data; }
void show_list(listNode list)
{
listNode temp;
temp=list;
while(temp)
{
cout<<temp->data<<"---";
temp=temp->next;
}
} int main(){
int arr[]={12,3,6,1,9,17,19,21,22,87};
listNode list=NULL;
list=(list_node*)malloc(sizeof(listNode));
list->data=0;
list->next=NULL;
int k=6; int val;
cout<<"创建链表:"<<endl;
createList(list,arr,10);
val=find_knode(list,k);
cout<<"倒数第<<k<<个节点为:"<<val<<endl;
cout<<"show list:"<<endl;
show_list(list);
return 0; }
运行结果如下:

在运行sublime text2时发现出现 error2的错误。
解决办法如下:打开F:\SublimeText2\Data\Packages\C++\c++.sublime-build
{
"cmd": ["g++", "${file}", "-o", "${file_path}/${file_base_name}"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++",
"variants":
[
{
"name": "Run",
//"cmd": ["bash", "-c", "g++ '${file}' -o '${file_path}/${file_base_name}' && '${file_path}/${file_base_name}'"]
"cmd": [ "${file_path}/${file_base_name}.exe"]
}
]
}
看到有注释的那一行,是原先配置的,现在把它注释掉,添加下面的一行:
"cmd": [ "${file_path}/${file_base_name}.exe"]
重新运行,就可以了。
查找单链表的倒数第k个值的更多相关文章
- 查找单链表中倒数第k个结点
本文转自:程序员面试题6--查找链表中倒数第k个结点 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode { i ...
- 查找单链表中倒数第K个位置上的结点,若查找成功返回该节点的data域,若不成功只返回0
算法的基本设计思想:定义两个指针变量p和q 初始时均指向头结点的下一个结点(即链表的第一个结点)p沿链表移动,当p移动到第k个结点时,q指针开始与p指针同时移动,当p指针移动到最后一个结点时,q指针 ...
- 判断闰年的方法以及如何获得单链表的倒数第K个元素
今天很悲催,心中向往的公司,打电话过来面试,问到我两个问题,结果竟然都没有回答上,伤心了,记录下今天失败,希望以后不要被同样的问题给PASS. 问题1.如何判断是否为闰年 所谓闰年那就是:四年一闰,百 ...
- 20140719 找到单链表的倒数第K个节点 判断一个链表是否成为一个环形 反转
1.找到单链表的倒数第K个节点 2.判断一个单链表对否形成环形 3.单链表翻转
- 输出链表的倒数第K个值
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路一:链表不能向前遍历,只能向后遍历.因此倒数第K个结点就是 正序的 :len(链表)-1-K的下一个. 注意,此处的思路与代码中具体实 ...
- 单链表输出倒数第k个结点值(栈实现)
思路1:定义两个指针变量p和q,初始时均指向头节点的下一个节点(链表的第一个节点),p指针沿链表移动: 当p指针移动到第k个节点时,q指针开始与p指针同步移动, 当p指针移动到最后一个节点时,q指针所 ...
- 面试题-----求单链表的倒数第k个节点
#include <iostream> using namespace std; struct node{ int value; struct node *next; }; struct ...
- 删除单链表的倒数第k个结点
策略 直接遍历总数为len,再次遍历第len-k+1个就是答案,但是这样遍历了O(N+k)个,可以在O在更短的时间内找到 图示 参考代码 #include <iostream> using ...
- C++获取单链表的倒数第k个节点
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ c ...
随机推荐
- 《F4+2团队项目需求改进与系统设计》
任务一 a.分析<动态的太阳系模型项目需求规格说明书>初稿的不足. 任务概述描述的有些不具体,功能的规定不详细,在此次作业进行了修改. b.参考<构建之法>8.5节功能的定位和 ...
- 【Golang 接口自动化04】 解析接口返回JSON串
前言 上一次我们一起学习了如何解析接口返回的XML数据,这一次我们一起来学习JSON的解析方法. JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基 ...
- RabbitMQ入门_06_深入了解ack
A. Delivery Tag 参考资料:https://www.rabbitmq.com/confirms.html 仔细查看一下 Consumer 的回调方法: public void handl ...
- 怒学Java8系列一:Lambda表达式
PDF文档已上传Github Github:https://github.com/zwjlpeng/Angrily_Learn_Java_8 第一章 Lambda 1.1 引言 课本上说编程有两种模 ...
- android--------Dagger2介绍与简单使用(一)
1:Dagger2是啥 Dagger是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架,原来是由Square公司维护的然后现在把这堆东西扔给Google维护了. 一般的I ...
- php--------删除数组的第一个元素和最后一个元素
对于一个php数组,该如何删除该数组的第一个元素或者最后一个元素呢?其实这两个过程都可以通过php自带的函数 array_pop 和 array_shift 来完成,下面就具体介绍一下如何来操作. ( ...
- CentOS7 Install Docker(转)
https://linux.cn/article-4340-1.html CentOS 7 中 Docker 的安装 Docker 软件包已经包括在默认的 CentOS-Extras 软件源里.因此想 ...
- Leetcode 73
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { vector<vec ...
- 10. Regular Expression Matching *HARD*
Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...
- 信号的发送kill,raise,alarm,setitimer,abort,sigqueue
1.kill函数 int kill(pid_t pid, int sig); 发送信号给指定的进程. (1) If pid is positive, then signal sig is sent t ...