我想说什么来着呢,马上要去高伟达笔试面试,我复习复习数据结构,链表,明天复习冒泡,一下大家参考,转载请注明出处~,谢谢合作
#ifndef LINKLIST_H
#define LINKLIST_H
template<class T>
struct Node
{
T data;
Node * next;
Node(){}
Node(T data)
{
this->data = data;
}
};
/*
@brief 链表
@author boss
@warning 请勿数组越界,或者输入不合法,因为没有检测
+insertElement
+removeElement
+create
+inverseCreate
+release
+printElement
-move
*/
template<class T>
class LinkList
{
public:
LinkList();
~LinkList();
public:
Node<T> * create(int n);
Node<T> * inverseCreate(int n);
void release();
void remove(int pos);
void print();
void insert(Node<T> * data ,int pos);
protected:
Node<T> * move(int pos);
Node<T> * head;
Node<T> * tail;
int len;
};
template<class T>
LinkList<T>::LinkList()
:head(0),
len(0)
{
head = new Node<T>();
head->next = NULL;
}
template<class T>
LinkList<T>::~LinkList()
{
}
/*
@brief 采用顺插法制作链表
@param n 空链表节点个数n 没有初始化;
@warning pre 永远指前一个节点 cur 永远指当前节点 顺插法要注意插入的最后一个节点->next 必须为NULL;
*/
template<class T>
Node<T> * LinkList<T>::create(int n)
{
Node<T> * pre = head;
Node<T> * cur = head;
len = (n) < 0 ? 0 : n;
for(int i = 0; i < len; i++)
{
cur = new Node<T>();
pre->next = cur;
pre = cur;
}
cur->next = NULL;
tail = cur;
return head;
}
/*
@brief 采用倒插法制作链表
@param n 空链表节点个数n 没有初始化;
@warning pre 永远指前一个节点 cur 永远指当前节点 顺插法要注意插入的最后一个节点->next 必须为NULL;
@warning 倒插法头和尾巴是相反的;
*/
template<class T>
Node<T> * LinkList<T>::inverseCreate(int n)
{
Node<T> * pre = head;
Node<T> * cur = head;
pre->next = NULL;
len = (n) < 0 ? 0 : n;
for(int i = 0 ;i < len; i ++)
{
cur = new Node<T>();
cur->next = pre;
pre = cur;
}
//此时的尾巴,是倒插法的头
tail = head;
//此时的头呢,是倒插发的当前值
head = cur;
return head;
}
/*
@brief 释放所有节点
*/
template<class T>
void LinkList<T>::release()
{
while (head)
{
Node<T> * pre = head;
head = head->next;
delete pre;
}
}
/*
@brief 移除特定的节点
@param pos 特定的位置
*/
template<class T>
void LinkList<T>::remove(int pos)
{
Node<T> * pre = move(pos);
Node<T> * cur = pre -> next;
Node<T> * link = cur->next;
delete cur;
pre->next = link;
len--;
}
template<class T>
void LinkList<T>::insert(Node<T> * data ,int pos)
{
Node<T> * pre = move(pos);
Node<T> * cur = pre -> next;
pre->next = data;
data->next = cur;
len++;
}
/*
@brief 打印
@warning 需要子类重新实现
*/
template<class T>
void LinkList<T>::print()
{
Node<T> * pre = head;
while(pre->next)
{
pre = pre->next;
}
}
/*
@brief 移动到特定的节点
@param 位置
@retern 反回节点
*/
template<class T>
Node<T> * LinkList<T>::move(int pos)
{
//_ASSERT(pos > 0,"error");
Node<T> * pre = head;
for(int i = 0; i < pos; i++)
pre = pre -> next;
return pre;
}
#endif