輸入一個鏈表,輸出該鏈表中倒數第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的位置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM