面试题22:链表中倒数第k个节点

本文介绍了一种高效查找链表中倒数第K个结点的方法。通过使用双指针技术,能够在遍历一次链表的情况下找到目标结点。讨论了空指针与野指针的问题,并提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:输入一个链表,输出该链表中倒数第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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值