【38】求链表倒数第k个结点

简介: 题目:输入一个单向链表(只有指向下一个结点指针),输出链表中的倒数第k个结点。分析:1. 一个单向链表只有指向下一个结点的指针,所以我们无法得到前面一个结点的指针,所以不能通过最朴素的枚举法来求出。


题目:输入一个单向链表(只有指向下一个结点指针),输出链表中的倒数第k个结点。


分析:

1. 一个单向链表只有指向下一个结点的指针,所以我们无法得到前面一个结点的指针,所以不能通过最朴素的枚举法来求出。

2. 现在要求出倒数第k个结点。现在用一个指针枚举是无法求出,但是我们可以使用两个指针法(非常重要)。

   初始化设置两个指针p1和p2,p1和p2都指向链表的头结点。我们可以先让指针p1指针先走到第k个结点,下一步开始两个指针p1和p2一起走,当p1指向链表最后一个结点的时候p2指向即为倒数第k个结点。

   为什么呢这个方法是正确的?

   当p1指向第k个结点的时候,p2和p1相差k个结点,所以当p1指向尾结点的时候,p2指向的即为倒数第k个结点。


代码:

//链表结点
struct ListNode{
    int value;
    ListNode *nextNode;
}; 

//求倒数第k个结点
ListNode* GetKthFromTail(ListNode *headNode, int k){
    //数据不合法
	if((headNode == NULL) || (k <= 0)){
	    return NULL;
    } 
    ListNode *p1 = headNode;
    ListNode *p2 = headNode;
    int count = 1;
    //让p1先走到第k个结点
	while((count < k) && (p1 != NULL)){
        p1 = p1->nextNode;
        ++count;
	} 
	//判断数据合法性
	if(p1 == NULL){
        return NULL;
	} 
	//两个指针一起走,当p1指向尾结点是p2指向即为倒数第k个结点 
	while(((p1->nextNode) != NULL)){
        p1 = p1->nextNode;
        p2 = p2->nextNode;
	}
	return p2;
} 


目录
相关文章
|
3月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
33 1
|
4月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
66 0
|
4月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
95 1
|
4月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
54 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
4月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
25 0
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
5月前
链表的中间结点
链表的中间结点
196 57
|
6月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
6月前
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点
|
6月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
68 5