输入一个链表,输出该链表中倒数第k个结点。

方法一:先遍历一遍链表,得到节点数目count,再取第count-k个节点即可。

/*耗时24ms

public class ListNode {
    int val;

    ListNode next = null;

    ListNode(int val) {

        this.val = val;
    }

}*/

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null || k ==0)
        {
            return null;
        }
         ListNode end = head;
         int count = 1;
        while(end.next != null)
        {
            count++;
            end = end.next;                        
        }
        if(count < k)
        {
            return null;
        }       
            end = head;
            for(int i =1;i<= count - k;i++)
            {
                end = end.next;
            }
            return end;       
    }

方法二:定义两个指针,均指向头结点,第一个指针先移动到第k个节点(即剩下节点长度为n-k),然后两个指针移动相同次数,直到第一个指针移到链表尾端,此时第二个指针指向第n-k,也就是倒数第k个节点。这就是快慢指针法。

/*耗时21ms

public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null || k <=0)
        {
            return null;
        }
         ListNode node1 = head;
         ListNode node2 = head;
        for(int i = 1 ; i< k;i++)
        {
            node1 = node1.next;
            if(node1 == null)
            {
                return null;
            }
        }
        while(node1.next != null)
        {
            node1 = node1.next;
            node2 = node2.next;                                  
        }     
            return node2;       
    }
}



猜你喜欢

转载自blog.csdn.net/sue12347/article/details/80180245