第一种方法先求出元素个数,在遍历元素个数-n个,时间复杂度为:O(N+N-n)=O(2N-n)。
第二种设置俩个指针,第一个先走N步,第二个开始走。俩者速度一样,时间复杂度为O(N)。
代码如下:
package dataStructtion.linear; /** * 获取单链表倒数第N个元素 * @author xiucai */ public class SingleLinkedList_LastN { /** * 第一种方法先求出元素个数,在遍历元素个数-n个 * 时间复杂度为:O(N+N-n)=O(2N-n) * @param list * @param n * @return * @throws Exception */ public static<T> T getLastN1(SingleLinkedList<T> list,int n) throws Exception{ int count=0; Node<T> node=list.head; while(node.next!=null){ count++; node=node.next; } if(count<n) throw new Exception("单链表元素个数小于 "+n+" !"); node=list.head; for(int i=0;i<count-n;i++){ node=node.next; } return (T)node.data; } /** * 设置俩个指针,第一个先走N步,第二个开始走。俩者速度一样 * 时间复杂度为O(N) * @param list * @param n * @return * @throws Exception */ public static<T> T getLastN2(SingleLinkedList<T> list,int n) throws Exception{ //fastN先走N步,slowN等fastN走N步后在开始走 Node<T> fastN=list.head,slowN=list.head; for(int i=0;i<n;i++){ if(fastN.next==null){ throw new Exception("单链表元素个数小于 "+n+" !"); /*try { } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ } fastN=fastN.next; } while(fastN.next!=null){ fastN=fastN.next; slowN=slowN.next; } return (T)slowN.data; } //测试方法 public static void main(String[] args) throws Exception { SingleLinkedList<String> list=new SingleLinkedList<String>(); for(int i=1;i<=100;i++){ list.append("第"+i+"个"); } System.out.println(getLastN2(list, 1000)); } }
相关推荐
2. **找出单链表的倒数第四个元素**:这道题目要求找到链表中倒数第k个元素,可以利用双指针技巧,让一个指针先向前移动k-1步,然后两个指针同步移动,当先移动的指针到达链表尾部时,另一个指针所指向的就是倒数第k...
本文档涵盖了单链表目录的各种问题和解决方案,包括单链表反转、找出单链表的倒数第4个元素、找出单链表的中间元素、删除无头单链表的一个节点、两个不交叉的有序链表的合并、有个二级单链表的转换、一级单链表的...
找出单链表的倒数第4个元素 - **原理**: 使用双指针技术,快指针先走四步,然后快慢指针同步移动,当快指针到达链表尾部时,慢指针所在位置即为所求。 - **步骤**: 1. 初始化两个指针`fast`和`slow`,均指向链表...
2. 找出单链表的倒数第4个元素: - 这可以通过两次遍历来实现。第一次遍历获取链表的长度,第二次遍历时定位到倒数第4个元素并返回。 3. 找出单链表的中间元素: - 快慢指针法:一个指针每次移动一步,另一个指针...
2. **找出单链表的倒数第k个元素** - 双指针法:一个指针先向前移动k步,然后再一起同步移动,当先移动的指针到达末尾时,另一个指针就是目标位置。 3. **找出单链表的中间元素** - 快慢指针法:快指针每次走两步...
2. **找出单链表的倒数第4个元素** 这通常通过两次遍历来完成:第一次遍历获取链表长度,第二次遍历至特定位置(长度减去3)。更高效的方法是使用双指针技术,其中一个指针先向前移动三步,然后两个指针同步移动,...
比如,“删除链表中的倒数第N个节点”要求你在不遍历完整链表的情况下找到并删除倒数第N个节点。 3. **字符串**:字符串处理题目涵盖了正则表达式匹配、子串查找、字符串反转等。一个典型的例子是“无重复字符的...
- **删除链表中的倒数第N个节点**:给定一个链表和一个正整数N,删除链表中的倒数第N个节点。 #### 2. 栈与队列 - **有效括号**:给定一个只包含字符 '(', ')', '{', '}', '[' 和 ']' 的字符串,判断其是否为有效的...
写一种函数找出一种单向链表旳倒数第 n 个节点旳指针。 知识点:链表的操作、算法设计。 6. 用递归算法判断数组 a[N]与否为一种递增数组。 知识点:递归函数、数组操作。 7.有一种文献(名为 a.txt)如下,每行...
5. 如何找出单链表中的倒数第 k 个元素 6. 如何检测一个较大的单链表是否有环 7. 如何把链表相邻元素翻转 8. 如何把链表以 k 个结点为一组进行翻转 9. 如何合并两个有序链表 栈与队列篇 1. 如何实现栈 2. 如何实现...
- **找出倒数第k个元素**: 使用双指针法,先移动一个指针k步,然后两个指针同时移动直到第一个指针到达链表尾部。 - **检测单链表是否有环**: 使用快慢指针技术,快指针每次移动两步,慢指针每次移动一步,如果有...
在无循环单链表中找到倒数第N个节点,可以通过双指针法实现。首先创建两个指针,都指向链表头。然后第一个指针先向前移动N步,之后两个指针同步移动,直到第一个指针到达链表尾部,此时第二个指针就指向了倒数第N个...
第一篇 面试题 ................................................................................ 8 1.1. 简介 ................................................................................................