careercup-链表 2.2
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相关推荐
- [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 ...
- [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 ...
- M1: 复制带随机指针的链表
一个链表问题:复制带随机指针的链表 题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制 ...
- 【CareerCup】 Linked Lists—Q2.5
转载请注明出处:http://blog.csdn.net/ns_code/article/details/22097191 题目: Given a circular linked list, ...
- 伍六七带你学算法 入门篇-链表的中间节点
力扣-876链表的中间节点 难度-简单 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5] 输出:此 ...
- Go 学习笔记(80)— Go 标准库 container/list(单链表、双链表)
列表是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系.列表有多种实现方法,如单链表.双链表等. 在 Go 语言中,将列表使用 container/list 包来实现,内部 ...
- 数据结构(08)— 线性单链表基本操作
1. 线性单链表数据结构 // 假定每个结点的类型用 SNode 表示 typedef struct SNodeTag {int data; // 所存储的数据元素SNodeTag *next; // ...
- 数据结构(05)— 线性单链表实战
1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...
- 使用python建立简单的单链表
代码 import sysclass ListNode:def __init__(self, x):self.val = xself.next = None# 将列表转换成链表 def list_to ...
- LeetCode19. Remove Nth Node From End of List 删除链表中的倒数第n个位置的元素
前言 本文是LeetCode19. Remove Nth Node From End of List解法,这个题目需要删除链表中的倒数第n个位置的元素 代码 # -*- coding: utf-8 - ...
最新文章
- Web 压力测试工具 --Apache AB
- epoll 使用详解
- MySQL修改和删除触发器(DROP TRIGGER)
- c#如何通过ftp上传文件_ftp自动上传工具,ftp自动上传工具如何自动上传文件
- 从傅里叶分析角度解读深度学习的泛化能力
- 【动态规划】【数位DP】[PA 2015]Rownanie
- Pytorch:初始化
- dubbo源码解析-spi(二)
- 李笑来登顶 GitHub TOP 榜!币圈大佬要教程序员如何自学编程
- 一种语音控制PPT翻页系统的制作方法
- 设计模式——代理模式(思维导图)
- Android中处理崩溃异常和分析日志的两种思路
- 干货分享好用的绘图工具
- 2、那智机器人时序基板的TBEX1、TBEX2连接
- HTML5海报生成器源码,原生js小项目 - canvas海报生成器
- 为什么犹太人能出这么多诺贝尔奖,看看他们的家庭教育吧!
- 视网膜屏幕和高清视网膜屏幕
- html做一个条码扫描页面,vue h5页面如何实现扫一扫功能,扫条形码获取编码
- 学习记录657@python计算股价的回撤与收盘价回撤率组合图实现
- 淘宝技术发展(Oracle/支付宝/旺旺)
热门文章
- linux中根目录下各个目录的作用
- 12月12日学习内容整理:Ajax中的contentType参数,csrf跨域请求处理,serialize方法...
- 每个Web开发人员应该知道的12个终端命令
- 1.6-puppet测试证书
- JavaCollection
- Windows server 2012 搭建×××图文教程(二)配置路由和远程访问服务
- Linux下显示前10个占用空间最大的文件或目录命令
- 3G时代需要“移动云计算专业”
- XP系统的用户头像是在那个文件夹里面
- linux 下 `dirname $0` 脚本文件放置的目录