如何找出单链表中倒数第K个元素

第一种方法

为了找出单链表的倒数第K个元素,需要知道这个单链表的长度是多少,就是需要遍历一遍这个单链表,长度为n,倒数第k个,就是单链表的第(n-k)个元素

public Node findLastK(Node head, int k){
        Node pNode = head;
        int n=0;
        while (pNode.next != null){
            n++;
            pNode = pNode.next;
        }
        pNode = head;
        for (int i=0;i<(n-k);i++){
            pNode = pNode.next;
        }
        return pNode;
    }

第二种方法

上面的方法需要进行两次遍历。
如果从头到尾方向从链表的某个元素开始,遍历k个元素后刚好到达了链表的末尾,那么当前元素就是要找的第k个元素。
算法步骤:

从头节点开始,依次对链表的每个节点元素进行这样的测试,遍历K个元素,直到可以到达链表的末尾。

分析:

这种方法将对同一批元素进行反复多次的遍历,对于链表中大多数元素而言,都需要遍历K个元素,如果链表的长度为n,那么这个算法复杂度为O(n*k)。

代码实现

public Node findLastK(Node head, int k){
        Node pNode = head;
        Node moveNode = head;
        int i = 0;
        while (pNode != null){
            moveNode = pNode;
            i=0;
            while (i<=k){
                moveNode=  moveNode.next;
                i++;
            }
            if (moveNode == null){
                break;
            }
            pNode = pNode.next;
        }
        return pNode;
    }

第三种解法

另一种高效的方式是只需要依次遍历就可以实现功能。

由于单链表只能从头到尾遍历元素,因此,如果要找出链表的倒数第k个元素的话,也只能从头到尾进行遍历查找,在查找过程中,设置两个指针,让其中一个指针比另一个指针(Java中无指针概念)向前移动k-1不,然后这两个指针同时向前移动,当先行指针移动到Null是,就代表另一个指针指向的位置就是倒数第k个节点。

代码实现:

public Node findLastK(Node head, int k) {
        if (k < 1) {
            return null;
        }
        Node p1 = head;
        Node p2 = head;
        for (int i = 0; i < k - 1 && p1 != null; i++) {
            p1 = p1.next;
        }
        while (p1.next != null) {
            p1 = p1.next;
            p2 = p2.next;
        }
        return p1;
    }

你可能感兴趣的:(面试数据结构和算法,链表,算法,数据结构,java)