剑指offer:链表中倒数第k个结点

2018-04-05  本文已影响26人  衣介书生

题目分析

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

代码

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

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        // k 的特殊情况
        if(k <= 0) {
            return null;
        }
        
        // 链表为空
        if(head == null) {
            return null;
        }
        
        // 链表不为空但是链表长度不足 k
        ListNode temp = head;
        int l = 0;  // 记录链表长度
        while(temp != null) {
            temp = temp.next;
            l += 1;
        }
        if(l < k) {
            return null;
        }
        
        // 长度刚好为 k,提高效率
        if(l == k) {
          return head;
        }
        
        // 正常情况,快慢指针
        ListNode fast = head;
        ListNode slow = head;
        for(int i = 0; i < k - 1; i++) {
            fast = fast.next;
        }
        while(fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        
        return slow;
    }
}
上一篇下一篇

猜你喜欢

热点阅读