`
lueye
  • 浏览: 13625 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

面试题:找出单链表倒数第N个元素

阅读更多

       第一种方法先求出元素个数,在遍历元素个数-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
3
分享到:
评论
1 楼 cywhoyi 2015-01-18  
时间复杂度都是O(N),不管你是O(2N),都是O(N),我的想法是遍历后,放到stack,LIFO获取倒数的

相关推荐

    算法大全面试题数据结构单链表的13道面试题含代码

    2. **找出单链表的倒数第四个元素**:这道题目要求找到链表中倒数第k个元素,可以利用双指针技巧,让一个指针先向前移动k-1步,然后两个指针同步移动,当先移动的指针到达链表尾部时,另一个指针所指向的就是倒数第k...

    算法大全-面试题-数据结构.docx

    本文档涵盖了单链表目录的各种问题和解决方案,包括单链表反转、找出单链表的倒数第4个元素、找出单链表的中间元素、删除无头单链表的一个节点、两个不交叉的有序链表的合并、有个二级单链表的转换、一级单链表的...

    算法,面试题

    找出单链表的倒数第4个元素 - **原理**: 使用双指针技术,快指针先走四步,然后快慢指针同步移动,当快指针到达链表尾部时,慢指针所在位置即为所求。 - **步骤**: 1. 初始化两个指针`fast`和`slow`,均指向链表...

    算法大全-面试题-数据结构

    2. 找出单链表的倒数第4个元素: - 这可以通过两次遍历来实现。第一次遍历获取链表的长度,第二次遍历时定位到倒数第4个元素并返回。 3. 找出单链表的中间元素: - 快慢指针法:一个指针每次移动一步,另一个指针...

    算法大全-面试题-链表-栈-二叉树-数据结构.docx

    2. **找出单链表的倒数第k个元素** - 双指针法:一个指针先向前移动k步,然后再一起同步移动,当先移动的指针到达末尾时,另一个指针就是目标位置。 3. **找出单链表的中间元素** - 快慢指针法:快指针每次走两步...

    算法大全-面试题-链表-栈-二叉树-数据结构

    2. **找出单链表的倒数第4个元素** 这通常通过两次遍历来完成:第一次遍历获取链表长度,第二次遍历至特定位置(长度减去3)。更高效的方法是使用双指针技术,其中一个指针先向前移动三步,然后两个指针同步移动,...

    力扣面试经典150题力扣面试经典150题

    比如,“删除链表中的倒数第N个节点”要求你在不遍历完整链表的情况下找到并删除倒数第N个节点。 3. **字符串**:字符串处理题目涵盖了正则表达式匹配、子串查找、字符串反转等。一个典型的例子是“无重复字符的...

    微软面试数据结构100题.pdf

    - **删除链表中的倒数第N个节点**:给定一个链表和一个正整数N,删除链表中的倒数第N个节点。 #### 2. 栈与队列 - **有效括号**:给定一个只包含字符 '(', ')', '{', '}', '[' 和 ']' 的字符串,判断其是否为有效的...

    2022年C语言笔试面试题整理.doc

    写一种函数找出一种单向链表旳倒数第 n 个节点旳指针。 知识点:链表的操作、算法设计。 6. 用递归算法判断数组 a[N]与否为一种递增数组。 知识点:递归函数、数组操作。 7.有一种文献(名为 a.txt)如下,每行...

    《C 程序员面试算法宝典》读书笔记模板x.pptx

    5. 如何找出单链表中的倒数第 k 个元素 6. 如何检测一个较大的单链表是否有环 7. 如何把链表相邻元素翻转 8. 如何把链表以 k 个结点为一组进行翻转 9. 如何合并两个有序链表 栈与队列篇 1. 如何实现栈 2. 如何实现...

    python程序员面试(算法完整)

    - **找出倒数第k个元素**: 使用双指针法,先移动一个指针k步,然后两个指针同时移动直到第一个指针到达链表尾部。 - **检测单链表是否有环**: 使用快慢指针技术,快指针每次移动两步,慢指针每次移动一步,如果有...

    data struct

    在无循环单链表中找到倒数第N个节点,可以通过双指针法实现。首先创建两个指针,都指向链表头。然后第一个指针先向前移动N步,之后两个指针同步移动,直到第一个指针到达链表尾部,此时第二个指针就指向了倒数第N个...

    世界500强面试题.pdf

    第一篇 面试题 ................................................................................ 8 1.1. 简介 ................................................................................................

Global site tag (gtag.js) - Google Analytics