一、单链表
1、头插法
不断从头部增加节点
代码如下
struct ListNode
{
ListNode(int val_)
{
val = val_;
next = NULL;
}
int val;
ListNode* next;
};
void insertList(ListNode* root, int len)
{
root->next = nullptr;
for(int i = 0; i <len; i++)
{
ListNode* p = new ListNode;
cin >> p->val;
p->next = root->next; // 先将根节点的所有节点放在p节点后面
root->next = p; //将p节点放在根节点后面
}
}
2、尾插法
代码如下
struct ListNode
{
ListNode(int val_)
{
val = val_;
next = NULL;
}
int val;
ListNode* next;
};
void insertList(ListNode* root, int len)
{
ListNode* node = root;
for(int i = 0; i <len; i++)
{
ListNode* p = new ListNode;
cin >> p->val;
node->next = p;
node = p;
}
}
二、循环链表结构和定义
循环链表是尾部节点的next指针指向头部节点
循环链表有两种表示方法:
一种方法是头指针表示法:即头指针的next指针指向第一个节点
另一种是尾指针表示法:即尾指针的next指针指向头指针,尾指针是尾部第一个节点
三、循环链表的合并
步骤:
1)将链表1的头指针赋值给节点p,
2)将链表1的尾结点的next指针指向链表2的第一个节点
3)将链表2的头结点删除
4)将链表2的尾结点指向节点p
四、双向链表
1、结构
struct ListNode
{
int val;
ListNode* next;
ListNode* prior;
};
2、双向循环链表
3、双向链表的插入
代码
struct ListNode
{
int val;
ListNode* next;
ListNode* prior;
};
void insert_node(ListNode* root, int len)
{
ListNode* L1 = root;
for(int i = 0; i < len; i++)
{
L1 = L1->next;
}
ListNode* p = new ListNode;
cin >> p->val;
L1->prior->next = p;
p->prior = L1->prior;
p->next = L1;
L1->prior = p;
}
4、双向链表删除
struct ListNode
{
int val;
ListNode* next;
ListNode* prior;
};
void insert_node(ListNode* root, int len)
{
ListNode* L1 = root;
for(int i = 0; i < len; i++)
{
L1 = L1->next;
}
ListNode* p = L1;
L1->prior->next = L1->next;
L1->next->prior = L1->prior;
delete p;
}
五、链表对比
六、链表和顺序表对比
顺序表比如vector这类,链表比如list这类。