输出链表中倒数第k个结点

题目:输入一个单向链表,输出该链表中倒数第k个结点。最后一个结点为倒数第一个结点。

思路:

1.首先遍历链表的长度获得链表的length,则它的倒数第k个结点就是正数length-k+1个结点,但这需要遍历链表两次

2.使用两个指针可以实现遍历一次,first指针指向头结点,second指针指向first之后的k-1个结点,然后两个结点循环向后移动,直到second结点到达链表的最后一个结点时,first结点指向倒数第k个结点。

注意:

1.要判断传来的参数 *head和k是否合法

2.判断k是否超过链表的长度。

代码如下:

struct listnode
{
    int data;
    listnode *next;
};
//使用尾插法构建链表
listnode *init()
{
    listnode *head=(listnode *)malloc(sizeof(listnode));
    head->next=NULL;
    listnode *last=head;
    int data;
    cout<<"请输入:(按-1结束链表)"<<endl;
    cin>>data;
    while(data!=-1)
    {
        listnode *temp=(listnode *)malloc(sizeof(listnode));
        temp->data=data;
        temp->next=last->next;//last的下一个为NULL
        last->next=temp;
        last=temp;
        cout<<"请输入:(按-1结束链表)"<<endl;
        cin>>data;
    }
    return head;
}
//打印链表
void print(listnode *head)
{
    listnode *temp=head->next;
    while(temp!=NULL)
    {
        cout<<"  "<<temp->data;
        temp=temp->next;
    }
}
//找到链表的第k个结点
listnode *findnumberK(listnode *head,unsigned int k)
{
    //判断参数是否正确
    if(head==NULL||k==0)
    {
        return NULL;
    }
    listnode *first=head;
    listnode *second=first;
    //第二个指针向前走k-1次
    for(int i=0;i<k-1;i++)
    {
        //判断第二个指针的next是否为空
        if(second->next!=NULL)
            second=second->next;
        //没有第k个结点
        else
            return NULL;
    }
    //两个指针循环向前走,第二个指针到达链表结尾,则第一个指针到达第k个结点
    while(second->next)
    {
        first=first->next;
        second=second->next;
    }
    return first;
}

测试代码以及运行结果:

int main()
{
    listnode *head=init();
    print(head);
    cout<<endl;
    cout<<findnumberK(head,3)->data<<endl;
    return 0;
}

时间: 2024-10-09 23:29:23

输出链表中倒数第k个结点的相关文章

【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;ListNode* m_pNext;}; 我的思路:先翻转链表,再从翻转后的链表的头向尾数k-1个,返回,再次翻转链表. 代码如下:注意这个思路非常差.差的原因是:如果只是用最原始的方法,先遍历一遍计数,再遍历一遍找倒数第k个,需要遍历两遍.但我的思路,翻转两次链表就要遍历两遍.还要在走k-1步找倒数第k

13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4250795.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 题目分析: 1.链表的倒数第0个结点为链表的尾指针,设为r,则r指向最后一

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

1. 题目描述 输入一个链表,输出该链表中倒数第k个结点. 2. 思路和方法 可以用两个指针,一个指针遍历到第k个结点的时候,第二个指针再走到第一个节点,然后两个指针的距离始终保持k-1.这样,当第一个指针的next==NULL,也就是走到最后一个节点的时候,第二个指针对应的位置,就是倒数第k个结点.这样的好处是能够节省一个循环,时间复杂度会相应降低,从Q(2N) 降低到到Q(N). 注意,但是需要一个小循环让第一个指针先走到第k个指针.同时也存在结点总数小于k的问题,如果循环还没有进行到k次,

链表中倒数第K个结点

题目:输入一个链表,输出改链表倒数第K个结点. 分析:常规方法可能就是,先遍历一遍链表,找到链表长度length,那么我们只需要第二次遍历length-k+1个结点就可以找到倒数第k个结点. 比较好的方法是采用两个指针,让一个指针先走K-1步,后面的指针再跟上.这样只需要遍历一遍. 注意:1.提高容错性,在链表为空 或者k为空.还有k大于链表长度. 2.链表下一个结点,我们采用p=p->next.指针指向的数组我们采用p++; typedef int Type; struct listNode{

输出链表中倒数第k个节点

题目描述 输入一个链表,输出该链表中倒数第k个结点. struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; 算法的实现:快慢指针 ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead==NULL||k==0) return NULL; ListNode *fast=N

剑指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 }