链表
通过指针连接起来的链。
特征:
1 地址不连续(也可以物理上连续,但是顺序不同,比如一次性开辟很多个节点)
2 存储下一个地址
struct node{
Data val;
node*next;
}
node *insert(node *head, node *nd){
if(head == NULL)
return nd;
node *tmp = head;
while(tmp->next != NULL)
tmp = tmp->next;
tmp->next = nd;
nd->next = NULL;
return head;
}
双向链表
同时存储前一个地址
链表反转:
1 插链表法:重新开辟地址或者直接在原有链表上取出插入新的链表。
2 直接反转:存储第一个到第最后一个的地址或数据,然后交换位置或数据
链表找环:
1 快慢指针:一个前进一步,一个前进两步,还可以据此算出环长,环位置
2 标记法:给已经走过的点特别标记。
链表相交:
使其中一个表成环,则就成为链表找环
节点删除:
1 从头找。。。
2 如果后面还有节点,可以把数据改为后一个节点,然后删除后一个节点。
深度拷贝(包含随机指针)
首先建立基本链表
然后:用映射实现链表地址与原链表地址的连接
用数组保存原链表关系,使原链表next先指向新链表,处理完再返回
原链表与新链表采用交替连接的方式,最后再分开。
链表反向输出
1 先反转再按序输出
2 递归
3 栈的使用
通过指针连接起来的链。
特征:
1 地址不连续(也可以物理上连续,但是顺序不同,比如一次性开辟很多个节点)
2 存储下一个地址
struct node{
Data val;
node*next;
}
node *insert(node *head, node *nd){
if(head == NULL)
return nd;
node *tmp = head;
while(tmp->next != NULL)
tmp = tmp->next;
tmp->next = nd;
nd->next = NULL;
return head;
}
双向链表
同时存储前一个地址
链表反转:
1 插链表法:重新开辟地址或者直接在原有链表上取出插入新的链表。
2 直接反转:存储第一个到第最后一个的地址或数据,然后交换位置或数据
链表找环:
1 快慢指针:一个前进一步,一个前进两步,还可以据此算出环长,环位置
2 标记法:给已经走过的点特别标记。
链表相交:
使其中一个表成环,则就成为链表找环
节点删除:
1 从头找。。。
2 如果后面还有节点,可以把数据改为后一个节点,然后删除后一个节点。
深度拷贝(包含随机指针)
首先建立基本链表
然后:用映射实现链表地址与原链表地址的连接
用数组保存原链表关系,使原链表next先指向新链表,处理完再返回
原链表与新链表采用交替连接的方式,最后再分开。
链表反向输出
1 先反转再按序输出
2 递归
3 栈的使用