【每日一题】链表系列(1) —— 返回倒数第k个结点

举报
AI 菌 发表于 2021/08/04 23:47:00 2021/08/04
【摘要】 写在前面:大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我热爱AI、热爱分享、热爱开源! 这博客是我对学习的一点总结与思考。如果您也对 深度学习、机器视觉、算法、C++、Python 感兴趣,可以关注我的动态,我们一起学习,一起进步~ 我的博客地址为:【AI 菌】的博客 文章目录 1. 题目(LeetCode 面试题)2. 解答过程3. 题目解答(...

写在前面:大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我热爱AI、热爱分享、热爱开源! 这博客是我对学习的一点总结与思考。如果您也对 深度学习、机器视觉、算法、C++、Python 感兴趣,可以关注我的动态,我们一起学习,一起进步~
我的博客地址为:【AI 菌】的博客

温馨提示:如果您对链表的结构还不了解,建议先加一个餐:【算法与数据结构 04】多图讲解——线性表、顺序表、链表


1. 题目(LeetCode 面试题)

原题:

实现一种算法,找出单向链表中倒数第 k 个结点。返回该结点的值。

  
 
  • 1

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

  
 
  • 1
  • 2

说明: 给定的 k 保证是有效的。


2. 解答过程

头脑风暴:
对于找倒数第k个结点的问题,常规思想是:从后向前朝,数到第k个元素即可。但是,单向链表只能循环后移,所以这里我们需要用到一种新的方法——双指针

所谓双指针,就是设置前、后两个指针都先指向头结点。后指针先移动到第k个结点,那么此时前、后指针相距k个位置。同步后移,当后指针指向链尾时,前指针就自然指向倒数第k个结点。

解答步骤:
根据上面的方法,我们可以将整个解答过程细分为3个简单的步骤:

  1. 初始化两个指针:前指针p1和后指针p2,且开始都指向头结点。
  2. 保持p1不变,先将p2移动到第k个结点,这时前、后指针相距k个位置。
  3. 同时向后移动p1和p2,当后指针指向链尾时,前指针就自然指向倒数第k个结点。

3. 题目解答

下面,我们就将上文中的解答步骤写成代码形式!

(1) C++ 示例

/**
 * Definition for singly-linked list.
 * struct ListNode {
 * int val;
 * ListNode *next;
 * ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public: int kthToLast(ListNode* head, int k) { if(head == NULL)  //判断头指针不为空 return 0; ListNode *p1 = head; //前指针 ListNode *p2 = head; //后指针 int i = 0; //i用来确保后指针移到第k个位置 while(i<k){ if(p2 == NULL) return 0; p2 = p2->next; i++; } //相距K个,同步移动,直到后指针到链表尾部。 while(p2 != NULL){ p1 = p1->next; p2 = p2->next; } return p1->val; }
};

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

(2) Python 示例

# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution(object): def kthToLast(self, head, k): """ :type head: ListNode :type k: int :rtype: int """ # 初始化前结点p1、后结点p2 p1 = head p2 = head # 移动后结点到第k个位置 for i in range(k): p2 = p2.next # 同时移动前、后结点,直至后结点指向链尾 while p2: p1 = p1.next p2 = p2.next return p1.val 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

运行结果:
在这里插入图片描述

文章来源: ai-wx.blog.csdn.net,作者:AI 菌,版权归原作者所有,如需转载,请联系作者。

原文链接:ai-wx.blog.csdn.net/article/details/108171197

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。