您的位置:首页 > Web前端

(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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: