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

// test14.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string>
#include<cctype>
#include <vector>
#include<exception>
#include <initializer_list>
#include<stack>
using namespace std;


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 temp(0);
        int count=0;
        ListNode *temp = pListHead; //注意,不能返回临时变量,因为临时变量的生存期只在此函数内
        
        while (pListHead != NULL) //统计节点个数
        {
            ++count;
            pListHead = pListHead->next;
            
        }
        count -= k;
        pListHead = temp;
    
        //注意:要判断要找的节点是否在范围内,如果在范围内,返回节点;如果不在,返回NULL
        if(count>=0)
        { 
            while (count--) //从前往后再次搜索
            {
                pListHead = pListHead->next;
            }
            return pListHead;
        }
        else
            return NULL;
        
    }
};


int main()
{
    int num;
    Solution so;
    cout << "请输入头结点:" ;
    cin >> num;
    ListNode pListHead(num);

    ListNode listNodeCopy = pListHead;
    

    cout << "依次输入后面的元素:"; // 此段输入有问题,有待进一步讨论
    while (cin>>num)
    {
        ListNode temp(num);
        pListHead.next = &temp;
        pListHead = temp;
        if (temp.val == 4)
            break;
    }
    pListHead = listNodeCopy;

    cout << "依次输出各个元素是:" << endl;

    while (&pListHead!=NULL)
    {
        cout << pListHead.val << "  ";
        pListHead = *pListHead.next;
    }
    



    ListNode result = *(so.FindKthToTail(&pListHead, 1));

    cout << "倒数第" <<1<<"个元素是:"<< result.val<<endl;

    
    return 0;
}
注意:1.本文所给的方法中,先遍历整个List,看有多少元素;再用总元素减去要求的倒数第k个元素的k;再遍历一下list直到遇到cout-k个元素,打印出来
      2.还有一种比较聪明的方法,建立两个ListNode节点,第一个节点先走k步,第二个节点再开始走;当第一个节点走到末尾的时候,第二个节点整好会走到count-k的位置。

转载于:https://www.cnblogs.com/wdan2016/p/5953659.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值