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

70 阅读1分钟

题目

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

注意:

  • k >= 1;
  • 如果 kk 大于链表长度,则返回 NULL;

数据范围

链表长度 [0,30][0,30]。

样例

输入:链表:1->2->3->4->5 ,k=2

输出:4

解析

两次遍历,第一次遍历算链表总长度n,如果 k > n, 返回nullptr。第二次遍历,令t1、t2 = pListHead先让t2走k步,然后t1,t2同时走,直到t2=nullptr,此时t1就为所求。

代码

GO

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func findKthToTail(pListHead *ListNode, k int) *ListNode {
    n := 0
    for l := pListHead; l != nil; l = l.Next {
        n ++ 
    }
    if n < k {
        return nil
    }
    t1, t2 := pListHead, pListHead
    for k > 0{
        t2 = t2.Next
        k -- 
    }
    for t2 != nil {
        t1 = t1.Next
        t2 = t2.Next
    }
    
    return t1
}