问题描述:

输入一个单向链表,输出该链表中倒数第k个结点。链表倒数第0个节点为NULL。
struct list_node {
int data;
list_node* next;
};

分析:

方法1:
首先计算出链表中节点的个数n,然后倒数第k个节点,为正数n-k+1个节点。
需要遍历链表2次。
方法1代码实现:
 // 13_1.cc
#include <iostream>
using namespace std; struct list_node {
int data;
list_node* next;
}; list_node* find_kth(list_node* head, size_t k) {
if (!head)
return NULL; // 统计链表中节点的个数
size_t count = ;
list_node* cur = head;
while(cur->next != NULL) {
cur = cur->next;
count++;
} if(count < k)
return NULL; cur = head;
for(size_t i = ; i <= count - k; i++)
cur = cur->next; return cur;
} // 插入元素
void insert_node(list_node*& head, int data) {
list_node* p = new list_node;
p->data = data;
p->next = head;
head = p;
} int main() {
// 创建链表
list_node* head = NULL;
for (int i = ; i > ; i--)
insert_node(head, i); // 查找倒数第k个
list_node* p = find_kth(head, );
cout << p->data << endl;
return ;
}

方法2:

使用双指针,第一个指针先走k步,然后两个指针一起走,直到第一个指针为NULL,则第一个指针便指向倒数第k个节点。
方法2实现代码:
 // 13_2.cc
#include <iostream>
using namespace std; struct list_node {
int data;
list_node* next;
}; list_node* find_kth(list_node* head, size_t k) {
if (!head)
return NULL; list_node* p1 = head;
for (size_t i = ; i <= k; i++) {
if (!p1) // 链表长度不足k
return NULL;
else
p1 = p1->next;
} list_node* p2 = head;
while (p1) {
p1 = p1->next;
p2 = p2->next;
}
return p2;
} // 插入元素
void insert_node(list_node*& head, int data) {
list_node* p = new list_node;
p->data = data;
p->next = head;
head = p;
} int main() {
// 创建链表
list_node* head = NULL;
for (int i = ; i > ; i--)
insert_node(head, i); // 查找倒数第k个
list_node* p = find_kth(head, );
cout << p->data << endl;
return ;
}

转载自源代码

本文链接地址: http://w.worthsee.com/index.php/13-%e6%b1%82%e9%93%be%e8%a1%a8%e4%b8%ad%e5%80%92%e6%95%b0%e7%ac%ack%e4%b8%aa

IT公司100题-13-求链表中倒数第k个结点的更多相关文章

  1. 剑指offer【13】- 链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第k个结点. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { ...

  2. 链表中倒数第k个结点 【微软面试100题 第十三题】

    题目要求: 输入一个链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 参考资料:剑指offer第15题 题目分析: 1.两个指针,第一个先走k步,然后两个指针同时走,直到第一个走 ...

  3. 第22题:链表中倒数第k个结点

    题目描述 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始它们的值依次是1.2.3.4.5 ...

  4. php实现求链表中倒数第k个节点

    php实现求链表中倒数第k个节点 一.总结 $head = $head->next; //1.将$head节点next域里面的记录的那个地址值($head节点的下一个节点的地址)给$head,$ ...

  5. 《剑指offer》第二十二题(链表中倒数第k个结点)

    // 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...

  6. 输出单项链表中倒数第k个结点——牛客刷题

    题目描述: 输入一个单向链表,输出该链表中倒数第k个结点 输入.输出描述: 输入说明:1.链表结点个数 2.链表结点的值3.输入k的值 输出说明:第k个结点指针 题目分析: 假设链表长度为n,倒数第k ...

  7. 剑指Offer编程题(Java实现)——链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 注意: 该题目不可以用先反转链表再输出第k个结点的方式,因为反转链表会改变该结点的next指向 思路一 使用栈Stack倒序存储,顺序pop第k个 ...

  8. 【剑指Offer面试编程题】题目1517:链表中倒数第k个结点--九度OJ

    题目描述: 输入一个链表,输出该链表中倒数第k个结点. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和k(0< ...

  9. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

随机推荐

  1. Date 与 switch的运用

    <html><head><title>日期</title><script>function toChinese(day){ switch(d ...

  2. C++—复合类型

    内容概要: -创建和使用数组 -创建和使用C-风格字符串 -创建和使用string类字符串 -使用方法getline()和get()读取字符串 -混合输入字符串和数字 -创建和使用结构 -创建和使用共 ...

  3. Maven打包遇到的一些问题(zhuan)

    http://qqbwww.iteye.com/blog/2042307 **************************************** #Maven打包遇到的一些问题 ## 1.将 ...

  4. C#_DataTable导出Execl为自定义标题

    public bool ExportExcel(DataTable tb, string path, string tbName) { //excel 2003格式 string connString ...

  5. drupal里面的ajax最粗浅的理解-流程

    1,  form里面的ajax所在地表单元素有一个事件,激发system/ajax,相应的有ajax_form_callback(), 会把被改变的元素值传到form_state[values]中, ...

  6. android用shape给linearLayout设置边框,怎样只保留底部或顶部的边框,把其它三个方向的边框去掉呢?

    http://bbs.csdn.net/topics/390485215 这种方法只是两个颜色块相减而已 <?xml version="1.0" encoding=" ...

  7. Office 多版本共存

    1 32位共存 假如已经安装了Office 2003(必定是32位的),那么安装 32位Office 2010 时会出现如下错误: 图1.1 解决办法: 1.将下述三个注册表项导出到文件2003A.r ...

  8. dede 调用四级导航

    一.修改文件:\include\taglib目录下的channel.lib.php,请将以下代码全部复制替换上述文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  9. 使用Objective-C的文档生成工具

    前言 做项目的人多了,就需要文档了.今天开始尝试写一些项目文档.但是就源代码来说,文档最好和源码在一起,这样更新起来更加方便和顺手.象Java语言本身就自带javadoc命令,可以从源码中抽取文档.今 ...

  10. Java中this、super用法

     这节我们主要是区分this 和 super这两个关键字的用法 起初我根本弄不清楚this 和 super这两个关键字的用法,也不明白在代码实例中为什么既用this又用super,下面就是原因: 1. ...