面试题22:链表中倒数第k个节点
题目:
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
思路:
1、求倒数第k个节点的值,我们归纳出当总共有n个节点时,倒数第k个节点就相当于从头开始的第n-k+1个节点。此方式要遍历两次链表第一次求出链表总数,第二次才能解出倒数第k个节点。
2、我们还可以设置两个指针都同时指向头结点,第一个指针先走k-1步然后第二个指针开始跟第一个指针一起向后遍历,当第一个指针遍历到最后一个元素时,第二个指针就是指向的倒数第k个节点。
代码:
/*** 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.考察所写代码的鲁棒性