1.双链表
单链表中的循环链表
链表的最后一个节点的pnext指向头节点
前:p->pnext == null
后:p->pnext == p->pheader
单链表的优势:
1.可以解决数组大小一旦决定之后很难改变的缺点
2.链表中的各个节点之间可以不用连续分配
3.分配的是堆空间,可以充分利用碎片化内存
单链表的缺点:
1.每个节点要分配指针变量,用来保存下一个节点的地址,浪费空间
2.只能指向下一个节点
3.无论什么类型的指针变量,所占用的都是4字节
双链表:
1.为了解决第二个缺点
2.双链表不是2个链表,就是单链表多了一个指向前节点的指针
2.创建节点
3.插入,尾插
比单链表多了一种向前遍历的方式
前向遍历:
1.获取链表中最后一个尾节点的地址
2.用while循环依次p->pnext != null
4.删除
头结点--》node 1-->node 2-->node 3-->null
伪代码:
1.将node2的前面的一个pnext指向后面的一个节点
2.将ndoe2的后面一个节点的pnext指向node2的前面的一个节点,及node1
3.释放node2这个节点所分配的堆空间
单链表中的循环链表
链表的最后一个节点的pnext指向头节点
前:p->pnext == null
后:p->pnext == p->pheader
单链表的优势:
1.可以解决数组大小一旦决定之后很难改变的缺点
2.链表中的各个节点之间可以不用连续分配
3.分配的是堆空间,可以充分利用碎片化内存
单链表的缺点:
1.每个节点要分配指针变量,用来保存下一个节点的地址,浪费空间
2.只能指向下一个节点
3.无论什么类型的指针变量,所占用的都是4字节
双链表:
1.为了解决第二个缺点
2.双链表不是2个链表,就是单链表多了一个指向前节点的指针
2.创建节点
3.插入,尾插
比单链表多了一种向前遍历的方式
前向遍历:
1.获取链表中最后一个尾节点的地址
2.用while循环依次p->pnext != null
4.删除
头结点--》node 1-->node 2-->node 3-->null
伪代码:
1.将node2的前面的一个pnext指向后面的一个节点
2.将ndoe2的后面一个节点的pnext指向node2的前面的一个节点,及node1
3.释放node2这个节点所分配的堆空间