时间限制:1秒 空间限制:32768K 热度指数:19220
题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:
1.本文所给的方法中,先遍历整个List,看有多少元素;再用总元素减去要求的倒数第k个元素的k;再遍历一下list直到遇到cout-k个元素,打印出来 2.还有一种比较聪明的方法,建立两个ListNode节点,第一个节点先走k步,第二个节点再开始走;当第一个节点走到末尾的时候,第二个节点整好会走到count-k的位置。
#include<iostream>
#include<fstream>
#include<string>
#include<cctype>
#include <vector>
#include<exception>
//#include <initializer_list>
#include<stack>
using namespace std;
#define N 4
//链表定义
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, i;
Solution so;
cout << "请输入头结点:";
cin >> num;
ListNode *p, *root;
root = (ListNode *)malloc(sizeof(ListNode));
root->next = NULL;
root->val = num;
p = root;
//建立
cout << "依次输入后面的元素:";
while (cin >> num)
{
ListNode *k = (ListNode *)malloc(sizeof(ListNode));
k->val = num;
k->next = NULL;
p->next = k;
p = p->next;
if (k->val == 4)//节点是4就结束
break;
}
//输出
p = root;
cout << "依次输出各个元素是:" << endl;
while (p->next != NULL)
{
cout << p->val << " ";
p = p->next;
if(p->val == 4)
{
cout << p->val << " ";
p = p->next;
break;
}
}
cout << endl;
ListNode result = *(so.FindKthToTail(root, 3));
cout << "倒数第" << 3 << "个元素是:" << result.val << endl;
return 0;
}
不懂的可以加我的QQ群:261035036(IT程序员面试宝典
群) 欢迎你的到来哦,看了博文给点脚印呗,谢谢啦~~