您的位置:首页 > 其它

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

2016-10-12 17:11 369 查看
// 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的位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐