// 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的位置。