找到單鏈表的後數第k個節點

看到一個面試題,簡單的,才下手做的。返回單鏈表的第k個節點(給出了尾指針),跟那個步長分別爲一爲二找到中間和最後的那個差不多。

就是定義兩個指針,都指向head,然後一個向後移動k步,再同時移動,到達尾巴即可。

代碼如下,望不吝賜教!

#include <iostream>

using namespace std;

typedef int ElemType;

class linkList
{
public:
	linkList();
	inline void insert(ElemType elem);
	void print() const;
	const ElemType& get_k(int k);
private:
	typedef struct Node
	{
		ElemType data;
		Node* next;
		Node(ElemType elem)
		{
			data = elem;
			next = NULL;
		}
	};
	Node* head;
	Node* tail;
};
linkList::linkList()
{
	head = NULL;
	tail = NULL;
}
void linkList::insert(ElemType elem)
{
	Node* pnew = new Node(elem);
	if(head)
	{
		pnew->next = head;
	}
	head = pnew;
}
const ElemType& linkList::get_k(int k)
{
	Node* p1 = head;
	Node* p2 = head;
	for(int i = 1; i < k; ++i)
	{
		if(p2->next == NULL)
			{
				cout << "Error! " << endl;
				return -1;
			}
		p2 = p2->next;
	}
	while(p2->next)
	{
		p1 = p1->next;
		p2 = p2->next;
	}
	return p1->data;
}
void linkList::print() const
{
	Node* p = head;
	while(p)
	{
		cout << p->data << "---->";
		p = p->next;
	}
	cout <<"\n\n";
}
int main(void)
{
	int k = 8;
	linkList list;
	list.insert(1);
	list.insert(2);
	list.insert(3);
	list.insert(4);
	list.insert(5);
	list.insert(6);
	list.insert(7);
	list.insert(8);
	list.print();
	cout << "the number of last but " << k << " is:";
	cout <<	list.get_k(k) << endl;

	return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章