刚开始,我想到的是一种笨方法,先遍历单链表,计算出单链表的长度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个值的更多相关文章

  1. 查找单链表中倒数第k个结点

    本文转自:程序员面试题6--查找链表中倒数第k个结点 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode { i ...

  2. 查找单链表中倒数第K个位置上的结点,若查找成功返回该节点的data域,若不成功只返回0

    算法的基本设计思想:定义两个指针变量p和q  初始时均指向头结点的下一个结点(即链表的第一个结点)p沿链表移动,当p移动到第k个结点时,q指针开始与p指针同时移动,当p指针移动到最后一个结点时,q指针 ...

  3. 判断闰年的方法以及如何获得单链表的倒数第K个元素

    今天很悲催,心中向往的公司,打电话过来面试,问到我两个问题,结果竟然都没有回答上,伤心了,记录下今天失败,希望以后不要被同样的问题给PASS. 问题1.如何判断是否为闰年 所谓闰年那就是:四年一闰,百 ...

  4. 20140719 找到单链表的倒数第K个节点 判断一个链表是否成为一个环形 反转

    1.找到单链表的倒数第K个节点 2.判断一个单链表对否形成环形 3.单链表翻转

  5. 输出链表的倒数第K个值

    题目描述 输入一个链表,输出该链表中倒数第k个结点.   思路一:链表不能向前遍历,只能向后遍历.因此倒数第K个结点就是 正序的  :len(链表)-1-K的下一个.  注意,此处的思路与代码中具体实 ...

  6. 单链表输出倒数第k个结点值(栈实现)

    思路1:定义两个指针变量p和q,初始时均指向头节点的下一个节点(链表的第一个节点),p指针沿链表移动: 当p指针移动到第k个节点时,q指针开始与p指针同步移动, 当p指针移动到最后一个节点时,q指针所 ...

  7. 面试题-----求单链表的倒数第k个节点

    #include <iostream> using namespace std; struct node{ int value; struct node *next; }; struct ...

  8. 删除单链表的倒数第k个结点

    策略 直接遍历总数为len,再次遍历第len-k+1个就是答案,但是这样遍历了O(N+k)个,可以在O在更短的时间内找到 图示 参考代码 #include <iostream> using ...

  9. C++获取单链表的倒数第k个节点

    /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ c ...

随机推荐

  1. ubuntu下xx-net可用IP为0, ping6显示 Network is unreachable

    不知和xx-net有没有关系. 全新安装系统 sudo apt-get install miredo 这时, ping6 ipv6.google.com 是能ping通的 按github上依次安装py ...

  2. 云服务器ECS挖矿木马病毒处理和解决方案

    云服务器ECS挖矿木马病毒处理和解决方案 最近由于网络环境安全意识低的原因,导致一些云服务器ECS中了挖矿病毒的坑. 总结了一些解决挖矿病毒的一些思路.由于病毒更新速度快仅供参考. 1.查看cpu爆满 ...

  3. GetContent

    Sub GetContent(ByVal URL As String, ByVal SheetName As String) Dim strText As String Dim i As Long D ...

  4. Yet Another Ball Problem CodeForces - 1118E (简单构造)

    大意: 求构造n个pair, 每个pair满足 对于每k组, 让$b_i$为$[1,k]$, $g_i$循环右移就好了 int n, k, cnt; int main() { scanf(" ...

  5. HDU-3506 Monkey Party (环形石子合并)

    题目大意:n堆石子围成一圈,每堆石子的块数已知,每次可以将相邻的两堆合并到一堆,块数变为两堆之和,代价也为两堆石子块数之和.求合并到一堆的最小代价. 题目分析:先通过将前n-1依次个移到第n个后面,将 ...

  6. Leetcode 82

    有个错误就是member access within null pointer of type 'struct ListNode' 其实就是判断了指针是否异常了,比如NULL->next之类.要 ...

  7. spring boot 学习(十一)使用@Async实现异步调用

    使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...

  8. XE7 Unit scope names

    今天编译RM报表 7.0 for XE7 ,build设计时包,提示 {$IFDEF JPEG}, JPEG{$ENDIF} 没有找到 JPEG.DCU,这个应该是XE7自带. 后来 在项目选项里,编 ...

  9. pyinstaller又踩一坑, configparser os.mknod

    在使用pyinstaller时,有使用configparser模块. 使用相对路径.在pycharm中测试,正常,打包成exe,就出错了 换用绝对路径, print(os.getcwd()) fp_d ...

  10. Spring学习笔记之The IoC container

    IoC is also known as dependency injection (DI). 这是一个过程?什么样的过程呢?对象自己定义它的依赖关系,这意味着,那些他们依赖的对象,只能通过构造函数参 ...