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

1.题目

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

来源:剑指offer
链接:https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&tPage=1&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

2.我的题解

(1)设置两个指针,称为快慢指针,快指针指向链表头,慢指针指向NULL
(2)快指针先走k步,然后将慢指针赋值为链表头,之后与快指针一起走。
(3)快指针到达NULL时,慢指针指向的节点即为要求结果。
k=4,List={1,2,3,4,5}为例。

k状态
4在这里插入图片描述
3在这里插入图片描述
2在这里插入图片描述
1在这里插入图片描述
0在这里插入图片描述
\在这里插入图片描述
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(k==0)return NULL;
        ListNode * cur=pListHead;
        ListNode * res=NULL;
        int cnt = k;
        while(cur){
            cur=cur->next;
            cnt--;
            if(cnt==0)res=pListHead;
            else if(cnt<0) res=res->next;
        }
        return res;
    }
};

3.别人的题解

本题需要注意的问题有:

  • k<=0应该返回NULL
  • k>len(List)应该返回NULL
  • 快指针比慢指针早出发k步,直到快指针为NULL
  • 快指针比慢指针早出发k-1步,直到快指针的下一个节点为NULL

我的思路是慢指针比快指针慢出发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 * fast=pListHead;
        for(int i=0;i<k;i++){
            if(!fast)return NULL;
            fast=fast->next;
        }
        while(fast){
            fast=fast->next;
            pListHead=pListHead->next;
        }
        return pListHead;
    }
};

4.总结与反思

(1)快慢指针,注意边界。
(2)有指定大小的数时,for循环较while循环一般更容易理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值