码迷,mamicode.com
首页 > 编程语言 > 详细

[算法]找出单链表中的倒数第k个元素

时间:2016-05-07 07:55:07      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

找出单链表中的倒数第k个元素


解题思路:

为了求出链表中的倒数第k个元素,最容易想到的方法是首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果。不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素。
如果沿从头至尾的方向从链表中的某个元素开始,遍历k个元素刚好到达链表尾,那么元素就是要找的倒数第k个元素。设计如下:依次对链表的每一个结点元素进行这样的测试,遍历k个元素,查看是否到达链表尾,直到找到那个倒数第k个元素。此种方法将对同一批元素进行反复多次的遍历,对于链表的大部分元素而言,都要遍历k个元素,如果链表长度为n,则该算法时间复杂度为O(kn)级,效率太低。
存在另一种更高效的方法。在查找过程中,设置两个指针,让其中一个指针比另一个指针先前移k-1步,然后两个指针同时往前移动。循环直到先行的指针指为NULL时,另一个指针所指的位置就是所要找的位置

程序如下:

public Node findElem(Node head,int k){
        if(k<1 || head == null)
        {
            return null;
        }
        Node p1 = head;
        Node p2 = head;
        for (int i = 0; i < k - 1; i++) { //前移k-1步
            if(p1.next != null){
                p1 = p1.next;
            }else {
                return null;
            }

        }
        while (p1 != null) {
            p1 = p1.next;
            p2 = p2.next;
        }
        return p2;
    }

Github源码地址

https://github.com/GeniusVJR/Algorithm-and-Data-Structure/tree/master/单链表的倒数第k个元素

[算法]找出单链表中的倒数第k个元素

标签:

原文地址:http://blog.csdn.net/codeemperor/article/details/51332514

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!