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

来源:互联网 发布:端口号的目的是 编辑:程序博客网 时间:2024/05/29 16:22

解题思路:

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


阅读全文
0 0