看到一个面试题,简单的,才下手做的。返回单链表的第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;
}