双向链表
来源:互联网 发布:阿里云smtp服务器地址 编辑:程序博客网 时间:2024/05/22 14:14
双向链表是指链表中的每个节点都有两个指针域,一个指向直接前驱节点,一个指向直接后继节点,定义如下:
typedef struct DoubleNode { int data; struct DoubleNode* pre; struct DoubleNode* next;}DbleList;
下面分别讲解对双向链表的创建,插入和删除操作
1.创建
创建链表就是创建一个空的链表,首先明确任务为创建一个链表,我们需要做的是,创建一个头结点head,并将头结点的next和pre设置为NULL
如下:
//创建双向链表
DbleList* CreateListNode(){ DbleList* pHeader = new DbleList(); pHeader->data = -1; pHeader->pre = NULL; pHeader->next = NULL; return pHeader;}
2.插入
链表的插入操作是在链表中插入一个节点,这里有两个方式,第一种方式,直接在链表末尾插入节点,第二种方式在指定位置插入节点
第一种方式:需要做的是,找到链表的末尾节点,将末尾的节点的next指向我们需要插入的节点pInsert,然后将pInsert的next设置为NULL,将pInsert的pre指向末尾节点
//在链表末尾插入一个节点
int InsertListNode(DbleList* pHeader, DbleList* pInsert){ if(!pHeader || !pInsert) return -1; //找到尾部节点 DbleList* pTmp = pHeader; while (pTmp->next) { pTmp = pTmp->next; } pTmp->next = pInsert;//末尾的节点的next指向我们需要插入的节点pInsert pInsert->pre = pTmp;//pInsert的pre指向末尾节点 pInsert->next = NULL;//pInsert的next设置为NULL return 0;}
第二种方式:需要做的工作是,找到插入点i的位置节点ptmp,然后将ptmp的next赋值给pInsert的next,ptmp的next的pre赋值为pInsert,pInsert的pre赋值为ptmp,ptmp的next赋值为pInsert
如下:
//在指定位置插入一个节点
int InsertListNode(DbleList* pHeader, DbleList* pInsert, int iPos){ if (!pHeader || !pInsert) { return -1; } DbleList* pTmp = pHeader; int i = 0; while (i++ < iPos && pTmp->next) //找到插入点i的位置节点ptmp { pTmp = pTmp->next; } pInsert->next = pTmp->next; //将ptmp的next赋值给pInsert的next pInsert->pre = pTmp; //pInsert的pre赋值为ptmp pTmp->next->pre = pInsert; //ptmp的next的pre赋值为pInsert pTmp->next = pInsert; //ptmp的next赋值为pInsert return 0;}
3.删除
链表的删除操作为删除指定的元素,我们需要知道被删除节点的位置或者被删除节点的内容,可以通过节点内容找到对应的节点位置,故只给出删除对应位置节点的操作
如下:
//删除指定位置的节点
int DelListNode(DbleList* pHeader, int iPos){ if (!pHeader) { return -1; } int i = 0; DbleList* pTmp = pHeader; while (i++ < iPos && pTmp->next)//找到对应ipos的节点 { pTmp = pTmp->next; } pTmp->pre->next = pTmp->next; //将pTmp的pre的next指针域赋值为ptmp->next pTmp->next->pre = pTmp->pre; //将pTmp的next的pre指针域赋值为pTmp->pre delete pTmp; //释放内存 pTmp = NULL; return 0;}
ps:水平有限,供参考使用。请大家批评指正,互相学习进步
0 0
- SzNOI 双向约瑟夫(双向链表)
- 双向链表&&堆栈
- 双向链表
- 使用双向链表
- 双向链表
- 双向循环链表
- 双向循环链表
- 双向链表
- 实现双向链表
- 双向循环链表
- 建立双向链表
- 双向链表
- 双向链表
- 双向循环链表
- 双向链表
- 链表-双向链表
- 双向链表
- 双向动态链表
- Mysql Fabric实现学习笔记
- HDU2680 Choose the best route 最短路
- appframework 左侧和右侧点击滑动显示
- 第28天【健身】
- zookeeper c api 常见变量注释
- 双向链表
- 黑马程序员——Java面向对象(三)
- wsdl2objc定制(一)namespace
- python里面的单引号,双引号以及三引号的介绍
- 求最长回文子串
- UVa 439 - Knight Moves (BFS)
- [UnityShader]shader书写技巧之制作新手指导
- 反转单链表
- 设计模式基础 我要看懂图