剑指offer 链表中倒数第k个结点

题目描述
输入一个链表,输出该链表中倒数第k个结点。

\color{blue}解题思路:
由于这是单链表,只能往一个方向遍历,因此第一想法可能是先遍历一遍链表,计算一下链表节点的总个数n,再从头开始走n - k个节点就是倒数k个节点。这种思路并没有啥毛病,不过有一种只访问一遍的思路。

使用resPtrkAfterPtr两个指针,kAfterPtrresPtr先除法k个节点。
然后resPtrkAfterPtr同时向后移动,当kAfterPtr到达链表的尾端时,此时resPtr指向的就是倒数第k个节点。
在这里插入图片描述
\color{blue}代码实现:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode *resPtr = pListHead, *kAfterPtr = pListHead;
        //kAfterPtr先出发k个节点
        while (k > 0) {
            if (kAfterPtr == NULL) {
            	//可能出现链表长度为5,但是要求找倒数第6个
                return NULL;
            }
            k -= 1;
            kAfterPtr = kAfterPtr->next;
        }
        //resPtr、kAfterPtr再同时移动
        while (kAfterPtr != NULL) {
            resPtr = resPtr->next;
            kAfterPtr = kAfterPtr->next;
        }
        return resPtr;
    }
};

在这里插入图片描述
\color{blue}题目推荐:
题1、LeetCode 矩阵置零
题2、LeetCode 下一个排列
题3、LeetCode 编辑距离(动态规划)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章