查找链表倒数第K个节点

查找链表倒数第k个节点的内容,这是个很简单的问题,最直接方法就是先遍历得到链表长度len,然后再遍历一次把第len-k节点读取出来。

代码如下:

void ArrayK(Node *link, int k)
{
	int len = 0;
	Node *temp = link;
	/*遍历得到链表长度*/
	while (link != NULL)
	{
		len++; 
		temp = temp->Next;
	}
	int i;
	if (k > len)
	{
		cout << "The value of k is too large!" << endl;
	}
	else
	{	/*再次遍历得到倒数第k个节点*/
		for (i = 0; i < len - k; i++)
		{
			link = link->Next;
		}
		cout << "The value of k is:" << link->data << endl;
	}
}
不过上面这种做法并不是最好的,因为要做两次遍历。

我们可以定义两个临时节点,第一个先遍历到第K个节点,然后第二个同时从头结点开始遍历,当第一个节点到尾端的时候,第二个节点即定位到len-k的位置,刚好倒数第k位。

代码如下:

void ArrayK(Node *Link, int k)
{
	Node *p, *q;
	p = Link;
	q = Link;
	int count=0;
	while (p != NULL)
	{
		/*进行移位,当p定位到第k位时,q开始前移,*/
		if (count < k)
		{
			count++;
		}
		else
		{
			q = q->Next;
		}
		p = p->Next;
	}
	if (count < k)
	{
		cout << "The value of k is too large!" << endl;
	}
	else
	{
		cout << "The value of k is:" <<q->data<< endl;
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值