输入一个链表,输出该链表中倒数第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的位置。
posted @ 2016-10-12 17:11  wdan2016  阅读(1717)  评论(0编辑  收藏  举报