今天刷《剑指offer》中的链表操作的题目,在一处曾经经常出错的位置再一次犯了错误,该错误为在一个自定义的链表中,遍历链表节点的过程中,由于错误的判断语句导致的死循环。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 链表节点的定义
*/
class Node {
int val;
Node next;

Node(int val) {
this.val = val;
}
}

/**
* 遍历链表的操作
*/
public class LinkedList {
public void iterateNode(Node node) {
while (node != null) {
System.out.print(node.val + " ");
if (node.next != null) { // 错误发生在此处,由于加入判断下一个节点不为空,才将next指针向后移动,所以当遍历到链表的最后一个节点时,它的下一个节点必为null,于是指针不向后移动,当前节点永不为null,发生死循环
node = node.next;
}
}
}
}

其实如上代码中的遍历中,if (node.next != null)不仅是多余的语句,而且也是错误的语句。因为在节点初始化的过程中,next成员会被初始化为null,故在while (node != null)的循环判断中,可以直接判断当前节点是否为空。若遍历到链表中最后一个节点时,它的下一个节点为空节点,可以直接执行node = node.next来将指针后移,在下一次while判断后不进入循环即可正常运行。修改后的代码如下:

1
2
3
4
5
6
public void iterateNode(Node node) {
while (node != null) {
System.out.print(node.val + " ");
node = node.next;
}
}