链表中倒数第k个结点

结点:

public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

找到倒数第k个结点:

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null || k==0) return null;    //判断链表是否为空,以及k值是否为0
        ListNode node1 = head, node2 = head;
        int num = 1;
        while(num<k){
            if(node1.next==null) return null;    //判断链表长度是否小于k值
            node1 = node1.next;
            num++;
        }
        while(node1.next!=null){
            node1 = node1.next;
            node2 = node2.next;
        }
        return node2;
    }
}

 

常规思想是,首先,从头到尾遍历链表,计算出链表的长度,然后遍历第二遍,找到倒数第k个结点。

这种做法需要遍历两次链表,可能不会满足面试官的要求。

本方法主要思想:设置两个结点node1,node2指向头结点,首先让node1指向链表的第k个结点,而node2仍然指向头结点。这样两结点每次共同前进一步,直到node1指向最后一个结点,这时,node2就指向了倒数第k个结点。

注意: 

       1. 要判断链表是否为空,以及k值是否为0。

       2. 要判断k值是否大于链表的长度。

posted on 2017-03-23 09:12  一个不会coding的girl  阅读(110)  评论(0编辑  收藏  举报

导航