哨兵
类属性
private Node head = new Node(Integer.MIN_VALUE, null);
头节点指向的是哨兵,哨兵的值可以设置为无穷小,初始的 next 设置为 null
这样一来,在后续过程中就不用再判断链表是否为空,因为带哨兵的链表永远是非空的
节点类(与无哨兵的单链表相同)
private static class Node {
private int value;
private Node next;
public Node(int value, Node next) {
this.next = next;
this.value = value;
}
}
addFirst(int value)方法
public void addFirst(int value) {
head = new Node(value, head);
}
直接插入,而无需判断链表是否为空
addLast(int value)方法
public void addLast(int value) {
Node last = head;
while (last.next != null)
last = last.next;
last.next = new Node(value, null);
}
同样也删去了判断
遍历
public void loop() {
Node curr = head.next;
while (curr != null) {
System.out.println(curr.value);
curr = curr.next;
}
}
注意的是,遍历要从头节点的下一个节点开始(因为头节点指向的是哨兵)
insert(int index, int value)方法
public void insert(int index, int value) {
Node prev = head.next;
for (int i = 0; prev != null; prev = prev.next, i++) {
if (index - 1 == i) {
break;
}
}
prev.next = new Node(value, prev.next);
}
remove(int index)方法
public void remove(int index) {
Node prev = head.next;
for (int i = 0; prev != null; prev = prev.next, i++) {
if (index - 1 == i) {
break;
}
}
prev.next = prev.next.next;
}
注意插入和删除都是要从头节点的下一个节点开始