c++数据结构与算法

双向链表:
在单向链表的deleteFromTail中有一个固有的问题,在删除后一个节点访问前一个节点的时候必须遍历所有节点恰好停在tail前面,对于较长的程序需要访问deleteFromTail函数这是加快速度的一个障碍,为了避免这个问题用了双向链表,双向指针,一个指向前驱一个指向后驱节点,
代码如下:
Template
Class DLLNode{
palic:
DLLNode(){
Next=prev=0;
}
DLLNode(const T& el,DLLNode *n=0,DLLNode *p=0){
Info=el;next=n;prev=p;
}
T info;
DLLNode *next,*prev;
};
Template
Void DoublyLinkedlist::addToDLLTail(const T&el){
If(tail!=0)
{
tail=new DLLNode(el,0,tail);
tail->prev->next=tail;
}
Else head=tail=new=DLLNode(el);
}
Template
T DoubyLinkedListdeleFromDLLTail(){
T el =tail->info;
If(head==tail){
Delete head;
Head =tail=0;
}
Else{
Tail=tail->prev;
Delete tail->next;
Tail->next=0;

}
Return 0;
}
………………
由于多了一个维护的指针,所以要比单向链表要复杂一些。
插入链表操作:

  1. 创建一个节点,然后初始化三个数据成员
  2. 将el赋值给info成员
  3. 将next成员赋值给null
  4. 将prev成员赋值为tail,使这个成员指向链表中最后一个节点。现在新节点应该是最后一个节点
  5. 令tail指向新节点。但是无法使用前驱结点访问新节点。
  6. 令前驱节点的next成员指向新节点。
    删除操作:
    将临时变量el设置为该节点中保存的值,然后令tail指向前驱节点。在删除最后一个节点。倒数第二个节点next设置成null,最后删除节点中储存的对象。执行从空链表中删除数据会导致崩溃所以应该是用if语句
    还有一种是单节点,在这种情况下head和tail都要设置成null。
    因为可以立即访问最后一个节点,所以addToDLLTail和deleteFromDLLTail都可以在恒定时间内
    很容易得到操作双向链表头节点的函数,只需要将head与tail互换,next和prev互换然后在执行new时交换参数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值