查找链表倒数第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;
}
}