cc150:实现一个算法从一个单链表中返回倒数第n个元素
来源:互联网 发布:男人眼中的女人味知乎 编辑:程序博客网 时间:2024/04/30 19:08
实现一个算法从一个单链表中返回倒数第n个元素。
解答
这道题的考点在于我们怎么在一个单链表中找到倒数第n个元素? 由于是单链表,所以我们没办法从最后一个元素数起,然后数n个得到答案。 但这种最直观的思路显然是没错的,那我们有没有办法通过别的方式,从最后的元素数起数 n个来得到我们想要的答案呢。这个次序颠倒的思路可以让我们联想到一种数据结构:栈。我们如果遍历一遍单链表,将其中的元素压栈,然后再将元素一一出栈。那么, 第n个出栈
的元素就是我们想要的。那我们是不是需要显式地用栈这么一个结构来做这个问题呢?答案是否。看到栈,我们应当
要想到递归,它是一种天然使用栈的方式。所以,第一种解决方案用递归,让栈自己帮我们从链表的最后一个元素数起。思路很简单,如果指向链表的指针还未空,就不断递归。当指针为空时开始退递归,这个过程n不断减1,直接等于1,即可把栈中当前的元素取出。
递归的特点就是理解直接,代码短小。所以,很多递归代码看起来都很漂亮(不包括我这个
哈,还用了两个全局变量,比较不美观)。
void findNthToLast1(node *head){ if(head==NULL) return; findNthToLast1(head->next); if(nn==1) pp = head; --nn;}
除了递归,这道题目还有别的方法还做吗? 答案
还是有。虽然我们没办法从单链表的最后一个元素往前数,但如果我们维护两个指针, 它们之间的距离为n。然后,我将这两个指针同步地在这个单链表上移动,保持它们的距离 为n不变。那么,当第二个指针指到空时,第一个指针即为所求。很tricky的方法, 将这个问题很漂亮地解决了。
node* findNthToLast(node *head, int n) {if(head==NULL || n < 1) return NULL;node *p = head,*q = head;while(n > 0 && q){q = q->next;--n;}if(n > 0) return NULL;while(q) {p = q->next;q = q->next;}return p;}
0 0
- cc150:实现一个算法从一个单链表中返回倒数第n个元素
- 2.2 实现一个算法从一个单链表中返回倒数第n个元素
- 008实现一个算法从一个单链表中返回倒数第n个元素(keep it up)
- 一个单链表中返回倒数第n个元素
- 返回单链表中倒数第N个元素问题
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- 【Java】实现一个算法,找出一个单链表中倒数第K个结点
- 返回线性链表的倒数第n个元素
- LinkLists 链表中返回倒数第n个元素 @CareerCup
- 从n个元素中选取第k大的元素,设计一个算法并说明算法复杂度
- 找出链表倒数第 n 个元素(算法)
- 查找一个单向链表中倒数第K个元素
- 求链表倒数第n个元素
- 算法实现:返回单链表的倒数第pos个节点
- 找出一个无环单链表里面的倒数第K个元素,时间复杂度为O(n)
- 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。
- 每天一个算法之链表中倒数第K个结点
- 【每天学点算法题10.14】给出一个单链表,返回倒数第K个节点的值
- 获得当前视图
- 为什么要使用ToolBar代替ActionBar
- JUnit in Action 2nd Edition 第三章 精通Junit(2)
- Android UI, GridView, ScrollView, SlidingDrawer 抽屉滑动效果
- 关于全局脚本和对象脚本
- cc150:实现一个算法从一个单链表中返回倒数第n个元素
- 內嵌html字符串顯示
- Android动态加载jar/dex
- Java中静态变量与静态方法的继承
- Android学习笔记(三)
- ASIHttpRequest请求HTTPS
- POJ 2229 Sumsets (递推&整数划分变形)
- ios调试开启zombie
- 项目开发积累