单链表在插入和删除操作时,有无头结点的实现是有区别的,总的来说,带有头结点的单链表实现起来比较方便,而不带头结点的单链表在链首插入和删除时要特殊处理,以下代码是带有头结点的单链表的实现。 //类定义、模板类的定义 #ifndef IncludeHeadNodeChain_H
带头结点的单链表实现 public class LinkedList {
private Entry head, tail; //头指针,尾指针
private int size; //通过一个变量记录链表长度
public LinkedList() {
//生成一个头结点,让头指针和尾指针都指向它
head = tail = new Entry(null);
size = 0;
}
public int size() {
return size;
}
public boolean isEmpty() {
return head.next == null; //当头结点的next为空,表明整个链表为空
}
public T get(int index) {
return current(index).element;
}
public T set(int index, T element) {
Entry entry = current(index);
T oldVal = entry.element;
entry.element = element;
return oldVal;
}
//默认在原链表尾部添加新的结点
public boolean add(T element) {
Entry newEntry = new Entry(element);
tail.next = newEntry;//原链表尾指针的next指向新的结点
tail = newEntry;//尾指针向后移动一位,指向新的结点
size++;
return true;
}
public boolean add(int index, T element) {
//若索引值和链表长度一样,新结点添加到链表最后位置
if (index == size)
return add(element);
//得到索引index的前一个结点
Entry preEntry = previous(index);
//新结点的next为preEntry的next指向的结点
Entry newEntry = new Entry(element, preEntry.next);
//preEntry的next指向新的结点
preEntry.next = newE