題目:
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
我的思路:
剛開始我把這個問題想簡單了
我想的是 直接把鏈表遍歷一遍 把每個節點都放到 vector 中
之後把vector 倒置一下 找第k個就可以
之前的代碼:
////// 創建含5個節點元素的的鏈表///////
Node* head = new Node();
head = createNodeList(5);
////// 打印鏈表的每個元素////////
printNodeList(head);
std::vector<Node*> vec;
Node* T = new Node();
T = head;
////// 把鏈表的每個節點放入vector///////
while (T->next != nullptr)
{
vec.push_back(T);
T = T->next;
}
vec.push_back(T);
//////// 查找倒數第k個元素//////
int k = 2;
for(int i = vec.size()-1;i>0;i--)
{
if(k == 1)
{
std::cout<<"倒數第2數值爲:"<<vec.at(i)->value;
}
k--;
}
雖然節點找對了,但是你的鏈表的結構破壞了
應該返回的鏈表的後繼元素都還是對的 現在後繼元素都是null 了
最後想的是還是要用鏈表來解決這個問題
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == nullptr)
return nullptr;
ListNode *p,*q;
p = q = pListHead;
int i = 0;
/////遍歷鏈表///
for(i; p!=nullptr;i++)
{
////在紙上一畫就明白了////
////找倒數第幾個就要正數移幾次 這樣纔不會破壞鏈表的結構////
if(i >= k)
q = q->next;
p = p->next;
}
//// 如果 給的k的位置超出鏈表的頭 那麼就是nullptr
return i <k ? nullptr :q;
}
};
p 是隻是用來循環鏈表的,
q 是我們要返回的節點
比如k=2 返回倒數第2個 也就是 4-5
那麼 i==2 == k時 開始 q = q->next
i最大等於4 也就是 進入3次if(i>=k)
執行3次 q=q->next
正好剩4 5