java 如何实现单链表中的尾插法
尾插法
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结点 } }