题目:求单链表中倒数第K个结点,最后一个结点的下标设置为1。
代码示例:
#include<iostream>
using namespace std;
template < typename T >
struct Node
{
T data;
Node *next;
};
template < typename T >
class LinkList
{
Node<T> *head;
public:
LinkList()
{
head = new Node<T>();
head->next = NULL;
}
~LinkList();
void CreateList(T a[], int n);
void Disp(void);
bool GetOneNode(int k,T &res);//得到倒数第k个结点的值
};
template<typename T>
LinkList<T>::~LinkList()
{
Node<T> *pre = head;
Node<T> *p = head->next;
while (p)
{
delete pre;
pre = p;
p = p->next;
}
delete pre;
}
template<typename T>
void LinkList<T>::CreateList(T a[], int n)
{
Node<T> *p = head;
for (int i = 0; i < n; i++)
{
Node<T> *q = new Node<T>();
q->data = a[i];
p->next = q;
p = q;
}
p->next = NULL;
}
template<typename T>
void LinkList<T>::Disp()
{
Node<T> *p = head->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
template<typename T>
bool LinkList<T>::GetOneNode(int k, T &res)
{
if (k<= 0)
{
cout << "输入" << k << "错误!" << endl;
return false;
}
if (head->next == NULL)
{
cout << "链表为空!" << endl;
return false;
}
Node<T> *p = head;
Node<T> *q = head;
for (int i = 0; i < k; i++)
{
p = p->next;
if (p == NULL)
{
cout << k << "大于链表的长度!" << endl;
return false;
}
}
while (p != NULL)
{
q = q->next;
p = p->next;
}
res = q->data;
return true;
}
void main()
{
const int n = 5;
int a[n] = { 5,5,6,3,0 };
LinkList<int> list;
list.CreateList(a, n);
list.Disp();
cout << endl;
//===
int k = 2;
int res = 0;
bool flag = list.GetOneNode(k,res);
if (flag)
cout << "倒数第" << k << "个结点的值:" << res << endl;
}