微软算法面试(8):输入一个单向链表,输出该链表中倒数第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

 

posted @ 2021-01-29 22:56  天涯学馆  阅读(77)  评论(0编辑  收藏  举报