因为在向链表任意地方添加元素时,在链表的头添加元素和在其他位置添加元素逻辑上有差别
(链表头没有之前的节点)
为了统一逻辑,引入设立虚拟头结点的思想
这个虚拟的头结点不存储任何元素,数据为null
所以头节点所对应的元素为dummyHead的next
没有引入虚拟头结点的实现:
public class LinkedList <E>{
private class Node{
public E e;//存储数据
public Node next;//指向下一个节点的位置
public Node(E e,Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
@Override
public String toString() {
return e.toString();
}
}
private Node head;//头结点
private int size;
//构造函数:初始化
public LinkedList(){
head = null;
size = 0;
}
//获取链表中的元素个数
public int getSize(){
return size;
}
//返回链表是否为空
public boolean isEmpty(){
return size==0;
}
//在链表头添加新的元素e
public void addFirst(E e){
// Node node = new Node(e);
// node.next = head;
// head = node;
head = new Node(e,head);
size++;
}
//在链表的index(从0开始计)添加新元素e
//在链表中不是一个常用的操作,练习使用
public void add(int index,E e){
//首先判断传入的index是否合法
if (index<0||index > size){
throw new IllegalArgumentException("传入的index不合法");
}
//如果在链表头部添加元素,需要特殊处理因为链表头没有上一个节点
if (index == 0){
addFirst(e);
}else{
//首先找到插入位置的上一个节点
Node prev = head;
for (int i = 0; i < index-1; i++) {
prev = prev.next;
}
// //进行插入操作
// Node node = new Node(e);
// //新节点的next指向prev的下一个节点
// node.next = prev.next;
// //prev的next指向node节点
// prev.next = node;
prev.next = new Node(e,prev.next);
size++;
}
}
//在链表的尾部添加一个节点
public void addLast(E e){
add(size,e);
}
}
引入虚拟头结点后的实现:
public class LinkedList <E>{
private class Node{
public E e;//存储数据
public Node next;//指向下一个节点的位置
public Node(E e,Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
@Override
public String toString() {
return e.toString();
}
}
private Node dummyHead;//头结点
private int size;
//构造函数:初始化
public LinkedList(){
//初始化虚拟头结点
dummyHead = new Node(null,null);
size = 0;
}
//获取链表中的元素个数
public int getSize(){
return size;
}
//返回链表是否为空
public boolean isEmpty(){
return size==0;
}
//在链表头添加新的元素e
//在链表的index(从0开始计)添加新元素e
//在链表中不是一个常用的操作,练习使用
public void add(int index,E e){
//首先判断传入的index是否合法
if (index<0||index > size){
throw new IllegalArgumentException("传入的index不合法");
}
//首先找到插入位置的上一个节点
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
prev.next = new Node(e,prev.next);
size++;
}
//在链表的尾部添加一个节点
public void addLast(E e){
add(size,e);
}
public void addFirst(E e){
add(0,e);
}
}