刷题笔记11——输出链表倒数第k个结点

题目描述

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

方法1:两次遍历链表

首先把头结点赋值给P,如果头结点不为零,则从0开始计算链表的长度,不断让其指向下一个结点。进而得到链表的表长。

可能链表长度会小于K,所以要判断一下

然后用表长得到倒数第k个数,再遍历一次链表即可

/*
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* p = pListHead;
        int cnt = 0;
        while(p != NULL) {
            p = p->next;
            cnt++;
        }
        
        p = pListHead;
        cnt -= k;
        
        if(cnt >= 0) {
            while(cnt--) {
                p = p->next;
            }
            return p;
        }
        
        return NULL;
    }
};

方法2:两个指针

使用两个指针,都指向头结点。
一个指针先遍历到第k个结点,在这之前如果都不为空,那么说明链表的长度大于k

等到第一个指针遍历完k个结点后,第二个指针开始走,两个指针一起走,这样两个指针就始终保持着同样距离,等到第一个指针为NULL的时候,第二个指针指向的结点就是倒数第k个结点了。

刷题笔记11——输出链表倒数第k个结点_第1张图片

/*
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* pFirst = pListHead;
        ListNode* pSecond = pListHead;
        
        int i = 0;
        for(; i < k; ++i) {
            if(pFirst != NULL) {
                pFirst = pFirst->next;
            } else {
                return NULL;
            }
        }
        
        while(pFirst != NULL) {
            pFirst = pFirst->next;
            pSecond = pSecond->next;
        }
        return pSecond;
    }
};

你可能感兴趣的:(刷题)