zoukankan      html  css  js  c++  java
  • 如何找出单链表中的倒数第k个元素

    1、为了找出倒数第k个元素,最容易想到的办法是首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下来遍历一次就可以得到结果。但是该方法存在一个问题,即需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素。

    2、显然,这种方法还可以进行优化。于是想到了第二种方法,如果从头至尾的方向从链表中的某个元素开始,遍历k个元素后刚好达到链表尾,那么该元素就是要找到的倒数第k个元素,根据这一性质,可以设计如下算法:从头节点开始,依次对链表的每一个节点元素进行这样的测试,遍历k个元素,查看是否到达链表尾,只到找到哪个倒数第k个元素。此种方法将对同一批元素进行反复多次的遍历,对于链表中的大部分元素而言,都要遍历K个元素,如果链表长度为n个的话,该算法的时间复杂度为O(kn)级,效率太低。

    3、存在另外一个更高效的方式,只需要一次遍历即可查找到倒数第k个元素。由于单链表只能从头到尾依次访问链表的各个节点,因此,如果要找到链表的倒数第k个元素的话,也只能从头到尾进行遍历查找,在查找过程中,设置两个指针,让其中一个指针比另一个指针先前移k-1步,然后两个指针同时往前移动。循环直到线性的指针值为NULL时,另一个指针所指向的位置就是所要找到的位置。代码如下:

        class Node{
            Node next=null;
            int data;
            public Node(int data){
                this.data=data;
            }
        }
        public class MyLinkedList {
         
            Node head=null;//链表头的引用
            public Node findElem(Node head,int k){
                if(k<1||k>this.length()){
                    return null;
                }
                Node p1=head;
                Node p2=head;
                for(int i=0;i
    ---------------------  
    作者:完美风暴4  
    来源:CSDN  
    原文:https://blog.csdn.net/jsqfengbao/article/details/44875779  
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    k3 cloud套打模板中出现单元格数据为空的情况,及无法正确的选择数据源
    k3 cloud中列表字段汇总类型中设置了汇总以后没有显示出汇总值
    k3 cloud查看附件提示授予目录NetWorkService读写权限
    k3 cloud中提示总账期末结账提示过滤条件太长,请修改此过滤条件
    金蝶云k3 cloud采购入库单校验日期不通过
    C# Code First 配置(二)
    C# Azure 远程调试
    C# ABP源码详解 之 BackgroundJob,后台工作(一)
    C# 在webapi项目中配置Swagger(最新版2017)
    高并发之
  • 原文地址:https://www.cnblogs.com/fengff/p/10476837.html
Copyright © 2011-2022 走看看