内存泄漏:
手动申请的空间没有及时释放,导致系统发生内存泄漏
valgrind:在程序运行过程中,测试是否发生内存泄露
快慢指针法:
链表倒置:
链表插入排序:
双向链表:
双向链表与单向链表的区别:
单向链表(Singly Linked List)
-
结构:单向链表的每个节点包含两部分信息:一部分是存储的数据(data),另一部分是指向列表中下一个节点的指针(next)。这意味着在单向链表中,你只能从头节点开始,按照链表的顺序逐个访问节点,直到到达链表的末尾(即遇到指向null的指针)。
-
操作:
- 插入:在单向链表中插入节点通常需要遍历到目标位置的前一个节点,然后修改其next指针指向新节点,新节点的next指针再指向原位置的后一个节点。
- 删除:同样需要遍历到目标节点的前一个节点,然后修改其next指针,使其跳过目标节点,直接指向目标节点的下一个节点。
- 遍历:只能从头节点开始,逐个访问每个节点,直到末尾。
-
优点:实现简单,内存利用率较高(每个节点只存储一个指针)。
-
缺点:只能单向遍历,某些操作(如删除中间节点)需要遍历。
双向链表(Doubly Linked List)
-
结构:双向链表的每个节点包含三部分信息:存储的数据(data)、指向前一个节点的指针(prev)和指向下一个节点的指针(next)。这种结构允许从两个方向遍历链表。
-
操作:
- 插入:与单向链表类似,但在插入新节点时,需要同时设置新节点的prev和next指针,以及相邻节点的指针。
- 删除:直接修改目标节点前后节点的指针,使其绕过目标节点。
- 遍历:可以从头节点开始正向遍历,也可以从尾节点开始反向遍历。
-
优点:支持双向遍历,使得某些操作(如从尾部开始遍历或删除节点)更为高效。
-
缺点:相比单向链表,每个节点需要额外的指针存储空间,内存利用率稍低。