查找单链表的倒数第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 ...
随机推荐
- 《剑指offer》第十六题(数值的整数次方)
// 面试题:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考 ...
- python3.6 ImportWarning: can't resolve package from __spec__ or __package__, falling back on __name__ and __path__
Cython emulates Python 2-style implicit relative imports on Python 3 Cython的锅(也就是绝大多数下载安装的python)新的i ...
- String字符串存入数据库中超出最大长度(oracle varchar2 4000)?应合理分条存储(java实现-工具/方法)
问题描述 需要向数据库中保存数据,但某个字段内容长度过长(有中文.符号.英文),应该根据字符串内容与数据库存储上限合理设置储存方式. 解决思路 分条存储,即多条数据前n个字段一致,最后内容字段不同,下 ...
- response.sendRedirect跳转 jsp:forward跳转
response.sendRedirect跳转 <% response.sendRedirect("online.jsp"); %> jsp:forward跳转 < ...
- Java基础-封装(09)
通过对象直接访问成员变量,会存在数据安全问题(比如年龄不能为负).这个时候,我们就不能让外界的对象直接访问成员变量. private关键字 是一个权限修饰符.可以修饰成员(成员变量和成员方法)被pri ...
- python-day15函数递归
1.递归: 在函数内,调用自己. (技巧: 每次调用时,函数前面需加上return,这样返回值就可以一层一层 的返回去) #def age(n):# if n == 1:# re ...
- c++中的new和delete
对于计算机程序设计而言,变量和对象在内存中的分配都是编译器在编译程序时安排好的,这带来了极大的不便,如数组必须大开小用,指针必须指向一个已经存在的变量或对象.对于不能确定需要占用多少内存的情况,动态内 ...
- 关于二级指针的使用(使用node指针建树)
struct node { int v; node *l,*r; }*p; 使用二级指针建树的话,如果p是非全局变量且一开始没有指向变量的话递归建树时必然要传递参数,但是如果只是简单的build(no ...
- 字符串练习——唐纳德与子串 (Easy)
G1. 唐纳德与子串 (Easy) Time limit per test: 1.0 seconds Memory limit: 256 megabytes 子串的定义是在一个字符串中连续出现的一段字 ...
- 高精度减法用string 和 stack
#include "bits/stdc++.h" using namespace std; int main() { string a,b; while(cin >> ...