链表中倒数第K个结点

题目:输入一个链表,输出改链表倒数第K个结点。

分析:常规方法可能就是,先遍历一遍链表,找到链表长度length,那么我们只需要第二次遍历length-k+1个结点就可以找到倒数第k个结点。

比较好的方法是采用两个指针,让一个指针先走K-1步,后面的指针再跟上。这样只需要遍历一遍。

注意:1.提高容错性,在链表为空 或者k为空。还有k大于链表长度。

2.链表下一个结点,我们采用p=p->next.指针指向的数组我们采用p++;


typedef int Type;
struct listNode{
Type data;
listNode *nextNode;
};

listNode* findInverOfK(listNode * pHead,int k)
{

//还有其他各种情况的考察,容错性检查
//链表递增到下一个结点:p=p->next,如果是指针指向一个数组,则用p++;
if(NULL==pHead||k<=0)
return NULL; //注意出错就返回NULL

listNode *p_first=pHead;
listNode *p_second=pHead;
for (int i=0;i<k-1;i++) //注意是k-1
{
if(p_second->nextNode!=NULL)
p_second=p_second->nextNode;
else
return NULL;
}
while(p_second->nextNode!=NULL)
{
p_first=p_first->nextNode; //注意不是p_first++;除非指向的是一个数组
p_second=p_second->nextNode;
}
return p_first;

}

链表中倒数第K个结点,布布扣,bubuko.com

时间: 2024-10-24 05:20:27

链表中倒数第K个结点的相关文章

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

先做做一些简单题找找手感,还有赞一个牛客的OJ,这样的提交方式很好,ACM那种对输入出处格式对于没有接触过ACM的人来说比较头疼,华为OJ那种格式描述不清楚的就更头疼了,卡在输入输出上就悲剧了,当然,输入输出也是需要了解的. 顺便吐槽一下华为SO挑战赛:题意有模糊的地方,挑战赛的题目没有区分度,作弊监管太松,判分规则未公开说明. 题目描述:输入一个链表,输出该链表中倒数第k个结点. 题目解析:设两个同步后移.相距k的指针就行,前面的指针触底,后面的指针即是倒数k个节点. 代码如下: 1 /* 2

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

链表中倒数第k个结点 参与人数:1699时间限制:1秒空间限制:32768K 通过比例:21.37% 最佳记录:0 ms|8552K(来自  无声) 题目描述 输入一个链表,输出该链表中倒数第k个结点. 题目链接:http://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 阐

高质量代码-链表中倒数第k个结点

题目描述: 输入一个链表,输出该链表中倒数第k个结点. 思路: 首先检查参数的合法性,head==null或节点数小于k都直接返回null. 让head先前进k-1步,ans指向头结点,然后head前进一步,ans也前进一步.当head到达最后一个节点时,ans指向倒数k个节点.时间复杂度O(n). 解决: 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 thi

【剑指offer】九,链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 分析:此题为常见的快慢指针问题,java实现时要注意空指针错误以及边界条件.使用两个指针p和q,一个指针先走k-1步,然后第二个指针开始走.当第一个指针指向单链表的最后一个节点时,第二个指针指向倒数第k个节点.代码如下: 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 }

IT公司100题-13-求链表中倒数第k个结点

问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法1: 首先计算出链表中节点的个数n,然后倒数第k个节点,为正数n-k+1个节点. 需要遍历链表2次. 方法1代码实现: 1 // 13_1.cc 2 #include <iostream> 3 using namespace std; 4 5 struct list_node { 6 int da

代码的鲁棒性:链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点. 代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution {

【面试题015】链表中倒数第k个结点

[面试题015]链表中倒数第k个结点    可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指向的就是倒数第K个结点:两个指针的间距保持为k-1: 当我们遍历列表的时候发现用一个指针是解决不了问题的,我们可以尝试用两个指针来解决问题, 一个指针走的比另外一个指针走得快一点,或者先让其中的一个指针走了若干步,然后再让第二个指针来走: kth.cpp: 123456789101112131415

《剑指Offer》题目:链表中倒数第k个结点

题目描述:输入一个链表,输出该链表中倒数第k个结点 题目分析:因为不能直接从链表的尾部遍历,所以要分两步走: 第一步:从链表的头部开始遍历,直至链表的尾部,统计出链表结点的个数 第二步:根据链表结点的个数,计算出倒数第k个结点的位置(从头部看的位置),即n-k+1个结点,输出该结点. Java代码: class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public clas

输出单链表中倒数第k个结点(Java版)

题目:输入带头结点的单链表L,输出该单链表中倒数第k个结点.单链表的倒数第0个结点为该单链表的尾指针.要求只能遍历一次单链表. 解题思路: 如果不要求只能遍历一次单链表,我们可以先遍历一次单链表,求出它的结点的总个数n(包括头结点),所以单链表的结点是从倒数第n-1个到倒数第0个,然后再遍历一次单链表,遍历时访问的第n-k-1个结点就是该单链表中倒数第k个结点.现在要求只能遍历一次单链表,可以设两个指针p和q,最开始时它们都指向头结点,然后p向后移动k位,最后p,q同时向后移动直到p为最后一个结