2.2 实现一个算法,找到单链表中倒数第k个节点。

这道题的考点在于我们怎么在一个单链表中找到倒数第n个元素? 由于是单链表,所以我们没办法从最后一个元素数起,然后数n个得到答案。 但这种最直观的思路显然是没错的,那我们有没有办法通过别的方式,从最后的元素数起数 n个来得到我们想要的答案呢。

这个次序颠倒的思路可以让我们联想到一种数据结构:栈。

我们如果遍历一遍单链表,将其中的元素压栈,然后再将元素一一出栈。那么, 第n个出栈的元素就是我们想要的。

那我们是不是需要显式地用栈这么一个结构来做这个问题呢?答案是否。看到栈,我们应当 要想到递归,它是一种天然使用栈的方式。所以,第一种解决方案用递归,让栈自己帮我 们从链表的最后一个元素数起。

思路很简单,如果指向链表的指针还未空,就不断递归。当指针为空时开始退递归,这个过 程n不断减1,直接等于1,即可把栈中当前的元素取出。代码如下:

node *pp;
int nn;
void findNthToLast1(node *head){if(head==NULL) return;findNthToLast1(head->next);if(nn==1) pp = head;--nn;
}

虽然我们没办法从单链表的最后一个元素往前数,但如果我们维护两个指针, 它们之间的距离为k。然后,我将这两个指针同步地在这个单链表上移动,保持它们的距离 为k不变。那么,当第二个指针指到空时,第一个指针即为所求。很tricky的方法, 将这个问题很漂亮地解决了。

C++实现代码:

#include<iostream>
#include<new>
using namespace std;struct ListNode
{int val;ListNode *next;ListNode(int x):val(x),next(NULL) {}
};void createList(ListNode *&L)
{int arr[10]= {1,2,3,2,5,6,7,3,9,1};int i;ListNode *p=NULL;for(i=0; i<10; i++){ListNode *tmp=new ListNode(arr[i]);if(L==NULL){L=tmp;p=tmp;}else{p->next=tmp;p=tmp;}}
}ListNode *findKNode(ListNode *L,int k)
{if(L==NULL)return NULL;ListNode *p=L;ListNode *q=L;int count=0;while(q){if(count==k){p=p->next;q=q->next;}else{count++;q=q->next;}}if(count==k)return p;elsereturn NULL;
}int main()
{ListNode *head=NULL;createList(head);ListNode *p=head;while(p){cout<<p->val<<" ";p=p->next;}cout<<endl;p=findKNode(head,11);if(p)cout<<p->val<<endl;
}

careercup-链表 2.2相关推荐

  1. [CareerCup] 2.4 Partition List 划分链表

    2.4 Write code to partition a linked list around a value x, such that all nodes less than x come bef ...

  2. [CareerCup] 4.4 Create List at Each Depth of Binary Tree 二叉树的各层创建链表

    4.4 Given a binary tree, design an algorithm which creates a linked list of all the nodes at each de ...

  3. M1: 复制带随机指针的链表

    一个链表问题:复制带随机指针的链表 题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制 ...

  4. 【CareerCup】 Linked Lists—Q2.5

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/22097191     题目: Given a circular linked list, ...

  5. 伍六七带你学算法 入门篇-链表的中间节点

    力扣-876链表的中间节点 难度-简单 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此 ...

  6. Go 学习笔记(80)— Go 标准库 container/list(单链表、双链表)

    列表是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系.列表有多种实现方法,如单链表.双链表等. ​ 在 Go 语言中,将列表使用 container/list 包来实现,内部 ...

  7. 数据结构(08)— 线性单链表基本操作

    1. 线性单链表数据结构 // 假定每个结点的类型用 SNode 表示 typedef struct SNodeTag {int data; // 所存储的数据元素SNodeTag *next; // ...

  8. 数据结构(05)— 线性单链表实战

    1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...

  9. 使用python建立简单的单链表

    代码 import sysclass ListNode:def __init__(self, x):self.val = xself.next = None# 将列表转换成链表 def list_to ...

  10. LeetCode19. Remove Nth Node From End of List 删除链表中的倒数第n个位置的元素

    前言 本文是LeetCode19. Remove Nth Node From End of List解法,这个题目需要删除链表中的倒数第n个位置的元素 代码 # -*- coding: utf-8 - ...

最新文章

  1. Web 压力测试工具 --Apache AB
  2. epoll 使用详解
  3. MySQL修改和删除触发器(DROP TRIGGER)
  4. c#如何通过ftp上传文件_ftp自动上传工具,ftp自动上传工具如何自动上传文件
  5. 从傅里叶分析角度解读深度学习的泛化能力
  6. 【动态规划】【数位DP】[PA 2015]Rownanie
  7. Pytorch:初始化
  8. dubbo源码解析-spi(二)
  9. 李笑来登顶 GitHub TOP 榜!币圈大佬要教程序员如何自学编程
  10. 一种语音控制PPT翻页系统的制作方法
  11. 设计模式——代理模式(思维导图)
  12. Android中处理崩溃异常和分析日志的两种思路
  13. 干货分享好用的绘图工具
  14. 2、那智机器人时序基板的TBEX1、TBEX2连接
  15. HTML5海报生成器源码,原生js小项目 - canvas海报生成器
  16. 为什么犹太人能出这么多诺贝尔奖,看看他们的家庭教育吧!
  17. 视网膜屏幕和高清视网膜屏幕
  18. html做一个条码扫描页面,vue h5页面如何实现扫一扫功能,扫条形码获取编码
  19. 学习记录657@python计算股价的回撤与收盘价回撤率组合图实现
  20. 淘宝技术发展(Oracle/支付宝/旺旺)

热门文章

  1. linux中根目录下各个目录的作用
  2. 12月12日学习内容整理:Ajax中的contentType参数,csrf跨域请求处理,serialize方法...
  3. 每个Web开发人员应该知道的12个终端命令
  4. 1.6-puppet测试证书
  5. JavaCollection
  6. Windows server 2012 搭建×××图文教程(二)配置路由和远程访问服务
  7. Linux下显示前10个占用空间最大的文件或目录命令
  8. 3G时代需要“移动云计算专业”
  9. XP系统的用户头像是在那个文件夹里面
  10. linux 下 `dirname $0` 脚本文件放置的目录