头插法和尾插法的示意图
时间: 2023-08-28 18:08:02 浏览: 107
头插法和尾插法是两种常见的链表插入方式。下面是它们的示意图:
头插法:
```
插入前的链表:1 -> 2 -> 3
+---+ +---+ +---+
| 1 | -> | 2 | -> | 3 |
+---+ +---+ +---+
插入元素 4 后的链表:4 -> 1 -> 2 -> 3
+---+ +---+ +---+ +---+
| 4 | -> | 1 | -> | 2 | -> | 3 |
+---+ +---+ +---+ +---+
```
尾插法:
```
插入前的链表:1 -> 2 -> 3
+---+ +---+ +---+
| 1 | -> | 2 | -> | 3 |
+---+ +---+ +---+
插入元素 4 后的链表:1 -> 2 -> 3 -> 4
+---+ +---+ +---+ +---+
| 1 | -> | 2 | -> | 3 | -> | 4 |
+---+ +---+ +---+ +---+
```
可以看出,头插法在链表头部插入元素,而尾插法在链表尾部插入元素。
相关问题
链表的头插法和尾插法的示意图和代码
链表的头插法和尾插法是两种常见的链表插入操作。
头插法:新节点插入到链表的头部,成为新的头节点。
示意图:
```
插入前: 插入后:
head new_node
| |
V V
node1 node1
| |
V V
node2 node2
| |
V V
node3 node3
```
代码实现:
```c++
// 头插法
void insert_head(ListNode *&head, int val) {
ListNode *new_node = new ListNode(val);
new_node->next = head;
head = new_node;
}
```
尾插法:新节点插入到链表的尾部,成为新的尾节点。
示意图:
```
插入前: 插入后:
head head
| |
V V
node1 node1
| |
V V
node2 node2
| |
V V
node3 new_node
|
V
node3
```
代码实现:
```c++
// 尾插法
void insert_tail(ListNode *&head, int val) {
ListNode *new_node = new ListNode(val);
if (head == nullptr) {
head = new_node;
} else {
ListNode *p = head;
while (p->next != nullptr) {
p = p->next;
}
p->next = new_node;
}
}
```
其中,`ListNode` 是链表节点的定义,包含一个 `val` 域和一个 `next` 指针,指向下一个节点。
不带头结点的单链表头插法和尾插法建立
好的,我可以为你介绍一下不带头结点的单链表头插法和尾插法的建立方法。
不带头结点的单链表是指链表的第一个节点就是存储数据的节点,而不是一个空的头结点。
首先,我们先来介绍头插法建立单链表的方法。具体步骤如下:
1. 定义一个指向链表头节点的指针变量head,初始化为NULL。
2. 读入一个新节点的数据,创建一个新节点并用该数据进行初始化。
3. 将新节点插入到链表的最前面,使其成为新的头节点。具体操作为:将新节点的next指针指向head,然后将head指针指向新节点。
4. 重复步骤2和3,直到读入的数据为结束标志。
头插法建立单链表的示意图如下所示:
```
NULL <- 1 <- 2 <- 3 <- NULL
```
接下来,我们再来介绍尾插法建立单链表的方法。具体步骤如下:
1. 定义一个指向链表头节点的指针变量head,初始化为NULL。
2. 定义一个指向链表尾节点的指针变量tail,初始化为NULL。
3. 读入一个新节点的数据,创建一个新节点并用该数据进行初始化。
4. 如果head指针为NULL,则将head和tail指针都指向新节点。
5. 如果head指针不为NULL,则将tail节点的next指针指向新节点,然后将tail指针指向新节点。
6. 重复步骤3到5,直到读入的数据为结束标志。
尾插法建立单链表的示意图如下所示:
```
NULL <- 1 <- 2 <- 3 <- NULL
```
阅读全文