题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。
#include<iostream>
using namespace std;
struct ListNode {
int value;
ListNode* pNext;
};
ListNode* FindKthToTail(ListNode* pHead, unsigned int k) {
if (pHead == nullptr || k == 0) {//①空指针②k为0时 无符号数0减一为0xFFFFFFFF
return nullptr;
}
ListNode* pFront = pHead;//前一个指针
ListNode* pBack = pHead;//后一个指针
//1.让后一个指针先向后移动n-1次
for (unsigned int i = 0; i < k - 1; i++) {
if (pBack->pNext != nullptr) {
pBack = pBack->pNext;
}
else {
return nullptr;//③链表长度小于k
}
}
//2.两个指针同步向后移动 直到后一个指针指向最后一个节点
while (pBack->pNext != nullptr) {
pBack = pBack->pNext;
pFront = pFront->pNext;
}
return pFront;
}
int main() {
ListNode* tes = FindKthToTail(nullptr, 2);
return 0;
}
1.这个思路很好,记一下。
2.空指针与野指针
a.空指针异常产生原因:
(1) 当一个对象不存在时又调用其方法会产生异常。 obj.method() // obj对象不存在
(2) 当访问或修改一个对象不存在的字段时会产生异常。 obj.method() // method方法不存在
b.野指针产生原因:
1)指针变量没有被初始化,它缺省值是随机的,它会乱指一气。
2)指针p被free或者delete之后,只是把指针所指的内存释放掉了,没有改变指针的值,此时,p沦落为野指针。正确的操作是delete之后,p重置为nullptr。