剑指offer19_链表中倒数第k个节点
链表中倒数第k个节点
输入一个链表,输出该链表中倒数第 kk 个结点。
注意:
k >= 1
;- 如果 kk 大于链表长度,则返回 NULL;
数据范围
链表长度 [ 0 , 30 ] [0,30] [0,30]。
样例
输入:链表:1->2->3->4->5 ,k=2输出:4
方法思路
由于单链表不能直接索引到前驱节点,只能从前往后遍历。我们通过两次遍历解决问题:
- 第一次遍历:获取链表总长度
n
。 - 第二次遍历:计算倒数第
k
个节点的正序位置为n - k + 1
,遍历到该位置即可得到目标节点。
注意:当 k > n
时,需返回 nullptr
。
时间复杂度
- O(n):链表总共遍历两次,时间复杂度为线性。
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* findKthToTail(ListNode* pListHead, int k) {int n = 0;for(auto p = pListHead; p; p = p->next) n ++;if(k > n) return nullptr;auto p = pListHead;for(int i = 0; i < n - k; i ++) p = p->next;return p;}
};
假设链表为 1 -> 2 -> 3 -> 4 -> 5
,求倒数第 2
个节点:
- 第一次遍历:
n = 5
。 - 计算位置:
n - k + 1 = 5 - 2 + 1 = 4
。 - 第二次遍历:移动到第
4
个节点(值为4
),返回结果。
边界条件
k <= 0
或k > n
时返回nullptr
。- 空链表直接返回
nullptr
。