(C++)剑指offer-14:链表中倒数第k个结点(代码的鲁棒性)
2018-02-12 22:09
435 查看
剑指offer-14:链表中倒数第k个结点
目录
剑指offer-14链表中倒数第k个结点目录
1题目描述
2问题分析
3另一种方法
1题目描述
输入一个链表,输出该链表中倒数第k个结点。2问题分析
如:一个链表有6个节点,从头节点开始,它们的值一次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。数据结构:链表
算法:双指针
代码的鲁棒性
思路
因为是单向链表,所以无法从后向前遍历;
一种直观的思路是先遍历链表得到链表的长度,然后第二次遍历就能找到第k个节点,但是需要进行两次遍历,不是好的方法;
这里使用两个指针实现一次遍历,第一个指针先走k-1步,第二个指针一直不动;然后两个指针同时移动,直到第一个指针遍历完成。因为两个指针间隔为k-1,所以第二个指针指向的节点即为倒数第k个节点。
需要注意代码的鲁棒性:
链表为空;
k == 0,因为k为无符号整数,k-1=0xFFFFFFFF,导致错误;
链表数不够k的情况,也就是第一个指针移动过程中变为nullptr。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead == nullptr || k == 0) return nullptr; ListNode* p1 = pListHead; ListNode* p2 = nullptr; for(unsigned int i=0; i<k-1; i++){ if(p1->next != nullptr) p1 = p1->next; else return nullptr; } p2 = pListHead; while(p1->next != nullptr){ p1 = p1->next; p2 = p2->next; } return p2; } };
3另一种方法
跟前面的原理差不多代码更简洁
class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { ListNode* p1 = pListHead; ListNode* p2 = pListHead; int i=0; for (; p1 != nullptr; i++) { if (i >= k) p2 = p2->next; p1 = p1->next; } return i < k ? nullptr : p2; } };
相关文章推荐
- 剑指offer:(15)代码的鲁棒性:链表中倒数第k个结点
- 【剑指offer】3.4代码的鲁棒性——面试题15:链表中倒数第k个结点
- 剑指offer第十四题【链表中倒数第k个结点】c++实现
- 剑指Offer—14—链表中倒数第k个结点
- [剑指Offer] 14.链表中倒数第k个结点
- 剑指offer代码解析——面试题15求链表中倒数第K个结点
- 剑指offer 3.4 代码的鲁棒性1- 链表中倒数第K个节点
- 剑指offer代码解析——面试题15求链表中倒数第K个结点
- 【剑指offer】14链表中倒数第k个结点
- 剑指Offer_14_链表中倒数第k个结点
- 剑指offer-链表中倒数第k个结点
- 剑指offer-算法题练习:part16 链表中倒数第k个结点
- 剑指offer--链表中倒数第k个结点
- 剑指Offer13 链表倒数第K个结点
- 剑指offer 链表中倒数第k个结点
- 代码的鲁棒性-面试题15-链表中倒数第k个结点
- 剑指Offer----面试题15:链表中倒数第K个结点
- [剑指offer-1517]链表中倒数第k个结点
- 剑指Offer面试题15(Java版):链表中倒数第K个结点
- 剑指offer 15题 【代码的鲁棒性】链表中倒数第k个结点