链表
1、单向链表
1.1、概念
- 链表是一个有序的列表
- 链表不同于数组,链表是以节点的形式存储,在物理空间上不一定连续
- 链表的每个节点的内部包含data(数据)域,指向后一个节点next(指针)域,如果是双向链表,还有一个指向前一个节点的previous (指针)域
- 链表的头结点不存储数据,只是为了指向链表的开头
1.2、对链表的操作
1.2.1、添加
//创建一个单向循环链表
class SingleLinkedList {
//设置一个头节点,头节点是固定的,无任何数据
private Node head = new Node(-1,"");
public Node getHead() {
return head;
}
/**
* 添加一个节点到链表之中(优化后的版本)
* 要根据人物的编号来插入到指定的位置(如果已经有了这个编号的人物,则添加失败,并给出提示)
*
* @param node 你要添加的节点
*/
public void adds(Node node) {
//因为头节点的固定的,不能动,所以我们定义一个辅助遍历temp
Node temp = head;
//表明该节点是否存在
boolean flag = false;
while (true) {
//当该链表到了最后一个节点
if (temp.getNext() == null) {
break;
}
//表示已经找到了该节点应该插入的位置
if (temp.getNext().getId() > node.getId()) {
break;
}
//新节点的编号已经存在,给出提示信息
if (temp.getNext().getId() == node.getId()) {
flag = true;
break;
}
//如果不是最后一个节点,则将temp后移
temp = temp.getNext();
}
//根据flag的值来判断是添加还是给出提示信息
if (flag) {
System.out.println(node.getId() + " 该节点已经存在,不能加入!");
} else {
node.setNext(temp.getNext());
temp.setNext(node);
}
}
}
1.2.2、删除
//创建一个单向循环链表
class SingleLinkedList {
//设置一个头节点,头节点是固定的,无任何数据
private Node head = new Node(-1,"");
public Node getHead() {
return head;
}
/**
* 根据传入的 id删除该节点
*
* @param id 要删除节点的 id
*/
public void delete(int id) {
//因为头节点的固定的,不能动,所以我们定义一个辅助遍历temp
Node temp = head;
//表明该节点是否存在
boolean flag = false;
while (true) {
//当该链表到了最后一个节点
if (temp.getNext() == null) {
break;
}
//表示已经找到了要删除的节点
if (temp.getNext().getId() == id) {
flag = true;
break;
}
//如果不是最后一个节点,则将temp后移
temp = temp.getNext();
}
//根据flag的值来判断是删除还是给出提示信息
if (flag) {
temp.setNext(temp.getNext().getNext());
} else {
System.out.println(id