鏈表中倒數第k個節點

題目:

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

在這裏插入圖片描述

數據結構是我的薄弱環節 要加強學習
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章