双链表类模板
注:DoubleLinkList类中的head代表刚刚进入链表的节点。
插入节点时,要分类讨论(和单链表一样)。
插入节点时注意指针顺序。
#include <iostream>
using namespace std;
template <class T>
class Node{
public:
T data;
Node<T> * pre;
Node<T> * next;
Node(const T& item){
data=item;
next=NULL;
pre=NULL;
}
~Node(){}
};
template <class T>
class DoubleLinkList{
private:
Node<T> * head;
int size;
public:
DoubleLinkList();
~DoubleLinkList(){}
void Insert(const T& item);
//插入一个节点,命名为head
void Pop();
//弹出head节点
void display();
//打印链表元素
int Size();
//获得链表中的节点个数
T top();
//获得head节点的数据
int Find_Bias(Node<T> * N);
//head节点与N节点之间的偏移量
Node<T> * GetHead();
//获得head节点指针
void MovForward(int bias);
//把head向前移动bias个结点
void MovBack(int bias);
//把head向后移动bias个节点
};
template <class T>
DoubleLinkList<T>::DoubleLinkList(){
head = NULL;
size=0;
}
template <class T>
void DoubleLinkList<T>::Insert(const T& item){
Node<T> * tmp= new Node<T>(item);
if(head==NULL){
head=tmp;
head->pre=head;
head->next=head;
size++;
//忘了size自增了
}
else{
//在head后插入一个节点
tmp->next=head->next;
tmp->next->pre=tmp;
tmp->pre=head;
head->next=tmp;
head=tmp;
size++;
}
}
template <class T>
void DoubleLinkList<T>::display(){
Node<T> * ptr = head;
for (int i = 0; i < size; i++)
{
cout<<ptr->data<<"->";
ptr=ptr->next;
}
cout<<endl;
}
template <class T>
int DoubleLinkList<T>::Size(){
return size;
}
template <class T>
void DoubleLinkList<T>::Pop(){
Node<T> * ptr= head;
head->next->pre=head->pre;
head->pre->next=head->next;
head=ptr->pre;
size--;
}
template <class T>
T DoubleLinkList<T>::top(){
return head->data;
}
template <class T>
int DoubleLinkList<T>::Find_Bias(Node<T> * N){
int sum=0;
Node<T> * ptr =head;
while (ptr != N )
{
if(sum >size){
break;
}
sum++;
ptr=ptr->next;
}
return sum;
}
template <class T>
Node<T> * DoubleLinkList<T>::GetHead(){
return head;
}
template <class T>
void DoubleLinkList<T>::MovForward(int bias){
for (int i = 0; i < bias; i++)
{
head=head->next;
}
}
template <class T>
void DoubleLinkList<T>::MovBack(int bias){
for (int i = 0; i < bias; i++)
{
head=head->pre;
}
}
int main(){
//测试Insert,display
DoubleLinkList<int> DL;
DL.Insert(1);
DL.Insert(2);
DL.Insert(3);
DL.Insert(4);
DL.Insert(5);
DL.Insert(6);
DL.display();
//测试GetHead,Find_Bias
Node<int> * j=DL.GetHead();
DL.MovForward(4);
cout<<DL.top()<<endl;
int bias= DL.Find_Bias(j);
cout<<bias;
// DL.Pop();
// DL.display();
}