文章目录
尾插法
1 思路
- 先定义一个新的节点,命名为node。
- 找到尾部位置
- 将node插入到单链表的尾部位置。
- 使node指向前一个结点,也就是原表的尾部位置。
插入前的单链表:
插入后的单链表:
2 插入过程
2.1 定义node节点
2.2 定义一个cur来查找单链表的尾部位置
定义一个cur来遍历单链表,如果cur.next != null,cur就往后走,直到遇到null,停止遍历,此时cur指向的位置就是单链表尾部位置。
2.3 将node插入到单链表的尾部位置
将node结点放到尾结点的后一个节点的位置。
2.4 让node结点与前一个结点连接起来
旨在修改当前cur节点的指向,将cur的地址域中存放node的地址。
3 注意点
在遍历单链表的时候,循环的判断条件应该是cur.next != null,而不应该是cur != null。
解释:
-
cur.next != null 的情况
1.cur.next != null 这条语句的含义是,cur指向的结点的地址域里的地址不是null。
2.单链表结点的地址域存放的是下一个节点的地址,cur.next 正好访问到的是下一个结点的地址。
3.如果cur的地址域的地址是null,说明cur的下一个节点就是空,即cur为末尾结点。 -
cur != null 的情况
当cur == null 的时候多遍历了一次,代码设计不合理。
4 为空的情况
如果单链表是空的,就不需要找尾结点是哪一个了,node就是第一个结点,直接让head指向node即可。
5 代码实现
//尾插法 - 插入几点到尾部
public void addEnd(int data) {
//1.定义一个结点和cur
ListNode cur = this.head;//代替head向后移动
ListNode node = new ListNode(data);//新结点node
//现在分两个情况:1.链表不为空,即链表的尾结点在最后一个结点处. 2.链表为空,即head就是尾结点.
//2.找到尾结点 - cur指向的地址为空就是尾结点
//情况2:链表为空
if(cur == null) {
this.head = node;//直接将头结点指向node结点
}else{ //情况1:链表不为空
while(cur.next != null) {
cur = cur.next;//找到下一个结点
}
//3.此时已经找到了尾结点,可以开始将结点串联起来了
cur.next = node;//cur的地址域指向node结点
}
}