Gear with Code Java Engineer

剑指Offer链表的倒数第k个节点

2019-12-31

这是一道经典的链表题目,题目虽简单,思路却很清奇。

1 题目描述

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

2 思路

  1. 用两个指针,一个指针先出发
  2. 当第一个指针到达第k个节点的时候,第二个指针才出发
  3. 当第一个指针到达结尾的时候,第二个指针正好在倒数第k个
  4. 因为二者之间相隔了k个节点(包括这两个指针正指向的节点)

3 java代码

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        // 初始条件
        if (head == null || k == 0) {
            return null;
        }
        
        // 用两个指针,一个指针先出发
        // 当第一个指针到达第k个节点的时候,第二个指针才出发
        // 当第一个指针到达结尾的时候,第二个指针正好在倒数第k个
        // 因为二者之间相隔了k个节点(包括这两个指针正指向的节点)
        
        // 定义两个指针
        ListNode p1 = head;
        ListNode p2 = head;
        
        // 先将第一个指针移到第k个节点,也就是向后移动k-1次
        while (k > 1) { // 判定成功的是从k到2,一共k-1次
            --k;
            if (p1.next != null) {
                p1 = p1.next;
            } else {
                // 还没移到第k个节点,下一个节点就为空了,说明链表不足k个节点,返回null
                return null;
            }
        }
        
        // 两个指针同时移动,直到第一个指针到达最后一个节点
        while (p1.next != null) {
            p1 = p1.next;
            p2 = p2.next;
        }
        
        return p2;
    }
}

Similar Posts

Comments