首页 > 其他分享 >[牛客]链表中倒数第k个结点

[牛客]链表中倒数第k个结点

时间:2023-04-16 12:31:51浏览次数:45  
标签:slow ListNode struct fast next 链表 牛客 向后走 倒数第

牛客链接

[牛客]链表中倒数第k个结点_结点

使用快慢指针法:

两种思路:

1.fast先向后走k-1次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点时,slow刚好在倒数第k个位置上;

2.fast先向后走k次,slow再向后走1次,然后fast和slow同时向后走,当fast走到最后一个结点的后面时(此时为NULL),slow刚好在倒数第k个位置上;

根据这个思路,我们可以写出初始代码如下:

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */


/**
 * 
 * @param pListHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{
   
   struct ListNode* fast,*slow;
   fast = slow = pListHead;
   while(k--)//循环k次
   {
     
    fast = fast->next;//fast向后走k次
   
   }
   while(fast)//当fast为空时,slow指向倒数第k个结点
   {
    slow = slow->next;//不为空,同时向后走
    fast = fast->next;


   }
   
   return slow;
}

需要注意代码中while(k--)是循环k次,而while(--k)是循环k-1次.

这样看,代码似乎没什么问题,但是运行之后报了错:

[牛客]链表中倒数第k个结点_链表_02

这时我们需要通过测试用例来进行分析

通过第三个用例,我们可以考虑到链表为空的情况

通过第四个用例,考虑到k多于链表结点数时的情况

进行逻辑分析和修改后的代码如下:

正确代码

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */


/**
 * 
 * @param pListHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{
    if(pListHead == NULL)//链表为空
    {
        return NULL;
    }
   struct ListNode* fast,*slow;
   fast = slow = pListHead;
   while(k--)
   {
     if(fast== NULL)//当k>链表结点数时
    {
        return NULL;
    }
    fast = fast->next;
   
   }
   while(fast)
   {
    slow = slow->next;
    fast = fast->next;


   }
   
   return slow;
}

需要注意的是代码中的if(fast == NULL)语句必须放在fast = fast->next;之前,原因可自行分析


结语:

这里本章内容就介绍完了,文章中某些内容我们之前有介绍,所以只是一笔带过,还请谅解。

希望以上内容对大家有所帮助

标签:slow,ListNode,struct,fast,next,链表,牛客,向后走,倒数第
From: https://blog.51cto.com/u_15992140/6193440

相关文章

  • 算法-回文链表-24
    /***Definitionforsingly-linkedlist.*publicclassListNode{*publicintval;*publicListNodenext;*publicListNode(intx){val=x;}*}*/publicclassSolution{publicListNodeReverseList(ListNodehead){i......
  • 链表
    list链表:STL中的链表是双向循环链表迭代器不支持随机访问包括数据域和指针域构造:默认、区间、拷贝、n个elem赋值:重载=、区间,n个elem交换:swap();大小:resize();插入和删除:remove();insert();erase();数据存取:无法使用[]和at, 可以使用front();back();不支持随机访问的......
  • 牛客练习110-D
    题目链接:https://ac.nowcoder.com/acm/contest/54129/D比赛的时候dp状态方程想错了,一直在做无用攻。思路:设\(dp[i]\)为用了i次魔法的期望值,递推地做即可。代码:#include<bits/stdc++.h>usingnamespacestd;constintmod=1e9+7;map<char,int>M;longlongqmod(longlong......
  • 环形链表_相交链表_多数元素(java语言)
    环形链表力扣141题问题:思路:创建hashset,把链表的每个节点放到集合中,在放入的过程中检查这个节点是否已经存在,存在则证明存在环。代码实现:publicclassSolution{publicbooleanhasCycle(ListNodehead){Set<ListNode>set=newHashSet<>();whi......
  • #yyds干货盘点# LeetCode程序员面试金典:K 个一组翻转链表
    题目:给你链表的头节点head,每 k 个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例1:输入:head=[1,......
  • 23-4-14--链表--银行排队问题之单队列多窗口服务
    假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统......
  • EF 多个链表查询
      查询格式如下:varresult=(frompinPackagejoinqinPackageLocationPricesonp.Idequalsq.PackageIdintopqfromrinpq.DefaultIfEmpty()selectnew{p,r}).ToList(); ......
  • 链表
    概述链表是一种通过指针串联在一起的线性结构链表在内存中的存储形式链表中的节点在内存中不是连续分布的,而是散乱分布在内存中的某地址上链表有节点组成,每个节点又分成两个部分:1)数据域(data)2)指针域数据域:存放数据指针域:存放指针,指向节点头节点(head)......
  • #yyds干货盘点# LeetCode程序员面试金典:两两交换链表中的节点
    题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1]代码实现:classSolution{publicListN......
  • 链表应用 II
    目录链表应用II应用2:Leetcode.25题目分析代码实现链表应用II应用2:Leetcode.25题目25.K个一组翻转链表输入:\(head=[1,2,3,4,5]\),\(k=2\)输出:\([2,1,4,3,5]\)分析这里,我们以前面题目中的用例,来说明算法的步骤。为了避免讨论边界条件,这里,我们使用一个\(dummy\)......