1. 程式人生 > >11. 微軟面試題:輸入一個單向連結串列,輸出該連結串列中倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標

11. 微軟面試題:輸入一個單向連結串列,輸出該連結串列中倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標

題目:輸入一個單向連結串列,輸出該連結串列中倒數第k個結點。連結串列的倒數第0個結點為連結串列的尾指標。

分析:

單鏈表只能向後遍歷,不能向前遍歷,尾指標好找,倒數第K個不能從尾指標向前找。

倒的不好找,正的好找,我們只需要知道連結串列的總長度,就可以知道正數第幾個節點(len(list) - k -1)。

實現如下:

#include<iostream>

using namespace std;

struct ListNode{
	ListNode(int _v = 0):value(_v), next(NULL) {}
	int value;
	ListNode* next;
	void add(ListNode* _l)
	{
		if(next== NULL)
			next = _l;
		else
			next->add(_l);
	}
};


ListNode* findNode(ListNode* root, int k/*倒數第k個*/)
{
	int len = 0;
	ListNode* p = root;
	while(p != NULL)
	{
		len ++;
		p = p->next;
	}

	if(k > len) return NULL;
	int i = 1;
	p = root;
	while( i < len-k+1)
	{
		p = p->next;
		i++;
	}
	return p;
}

int main()
{
	ListNode *root = new ListNode(0);
	ListNode l1(1);
	ListNode l2(2);
	ListNode l3(3);
	ListNode l4(4);
	ListNode l5(5);
	ListNode l6(6);
	root->add(&l6);
	root->add(&l5);
	root->add(&l4);
	root->add(&l3);
	root->add(&l2);
	root->add(&l1);

	cout << "List 節點為:" ;
	ListNode* p = root;
	while(p != NULL)
	{
		cout << p->value << ",";
		p = p->next;
	}
	cout << endl;
	p = findNode(root, 4);
	cout << "List 倒數第 4 個節點是:" << p->value << endl;
	return 0;
}

輸出結果為:

List 節點為:0,6,5,4,3,2,1,
List 倒數第 4 個節點是:4