1 打印单链表中的数据
1.1 整体思路
图1:
head指向哪个节点,就去打印哪个节点的数据。打印完成后,head通过访问下一个节点的地址来找到下一个节点,然后打印对应的数据。
图1先是会打印出12,head往后走会依次打印出23、34、45、56。
图2:
例如图2就是会打印出23的情况。
为了打印出所有的节点,需要写一个循环来实现对所有节点的访问。
1.2 注意点
注意点:
循环的结束条件有一个坑,结束条件应该是 head != null,而不是 head.next != null
如果循环的结束条件是 head != null,当head指向null的时候,节点数据已经全部打印了。
如果循环的结束条件是 head.next != null,当head指向最后一个节点的时候,通过这个节点存储的下一个节点的地址找到下一个节点是空,循环此时会跳出,并且会少打印一个最后节点的数据。
当打印结束是head为空,便不再指向链表的头节点,所以要定义一个cur来代替head移动。
1.3 打印过程
无论是多少个节点都是这样打印的,所以为了便于演示这里只画三个节点的图。
此时cur指向数据12的节点,循环结束判定为真,代码会打印12。然后cur指向下一个节点。
与上一步类似,打印23后cur指向下一个节点。
打印34后,cur指向下一个节点,看它是不是空的。
此时cur指向一个null,循环跳出并且成功打印了所有结点的数据。
1.4 代码实现
public void disPlay() {
ListNode cur = this.head;//代替head移动
while (cur != null) {
System.out.print(cur.value + " ");
//找到下一个结点
cur = cur.next;
}
System.out.println();//换行
}
2 得到单链表的长度
2.1 整体思路
- 先定义一个计数器变量来记录结点个数
- 写一个循环来遍历单链表
- 当cur == null的时候跳出循环
- 最后返回计数器变量的值
2.2 求长度过程
cur不为空,结点个数加1个,count++。
cur不为空,结点个数加1个,count++,count此时为2。
cur不为空,结点个数加1个,count++,count此时为3。
cur为空,count此时为3,返回此时count的值
2.3 代码实现
public int size() {
int count = 0;//计数器,统计结点的个数
//为了head不会向后移动直至指向null,导致头结点消失,定义一个临时变量来代替head移动
ListNode cur = this.head;
while (cur != null) { //尾结点为null
count++;//结点个数加1
cur = cur.next;//头结点指向下一个结点
}
return count;//返回结点数
}