双向链表实现
再想想上面图片,下面要介绍的就是双向链表,双向链表与单项链表的区别就在于它有一个指向前一个节点的指针,于是我们就应该定义这样的结构体
typedef struct NODE
{
int data;
struct NODE *next;
struct NODE *pre;
}node;
由于双向链表不可避免有些操作需要从后向前遍历,于是我们就应该添加一个概念,尾指针,也就是指向尾节点的指针,如下就实现了一个双向链表,它有三个节点abc,并有两种输出方式
#include
typedef struct NODE
{
int data;
struct NODE *next;
struct NODE *pre;
}node;
int main(){
node *a=new node,*b=new node,*c=new node;
node *head=a;
node *tail=c;
a->data=9;
a->next=b;
a->pre=NULL;
b->data=17;
b->next=c;
b->pre=a;
c->data=6;
c->next=NULL;
c->pre=b;
//输出
/*node *print_head=head;
while(print_head!=NULL){
std::cout<data<<"\n";
print_head=print_head->next;
}*/
/*node *print_head=tail;
while(print_head!=NULL){
std::cout<data<<"\n";
print_head=print_head->pre;
}*/
system("pause");
}
双向链表的难点不是创建输出而是插入与删除,我没有制作图片,所以这需要读者认真去思考一下,建议画图,也很容易理解,下面代码是在上面创建了abc的基础上实现的在ab间插入一个k,然后再删除它
//插入
node *k=new node;
k->data=698;
k->pre=a;
k->next=a->next;
k->next->pre=a;
a->next=k;
//删除
k->pre->next=k->next;
k->next->pre=k->pre;
循环单链表 循环链表我不考虑讲,因为它就是把尾巴节点指向了头节点从而形成一个环,所以说循环链表不叫loop linked list而叫circular linked list