面试题22:链表中倒数第k个节点
题目:
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
思路:
1、求倒数第k个节点的值,我们归纳出当总共有n个节点时,倒数第k个节点就相当于从头开始的第n-k+1个节点。此方式要遍历两次链表第一次求出链表总数,第二次才能解出倒数第k个节点。
2、我们还可以设置两个指针都同时指向头结点,第一个指针先走k-1步然后第二个指针开始跟第一个指针一起向后遍历,当第一个指针遍历到最后一个元素时,第二个指针就是指向的倒数第k个节点。
代码:
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int kthToLast(ListNode* head, int k) {
if(head==NULL||k==0)
return NULL;
ListNode* first_index = head;
ListNode* second_index = head;
for(int i=0;i<k-1;i++){
if(first_index->next==NULL)
return NULL;
first_index = first_index->next;
}
while(first_index->next!=NULL){
first_index = first_index->next;
second_index = second_index->next;
}
return second_index->val;
}
};
注:
以下情况会导致代码崩溃,需要考虑
- 输入head为空指针。
- 输入head为头节点的链表的节点总数少于k。
- 输入参数k为0。由于k是无符号整数,在for循环中k-1将得到4294967295。
考点:
1.考察链表的理解
2.考察所写代码的鲁棒性