## 单链表插入、删除和查找操作

#### 三、单链表的插入：

1、头插法
2、尾插法
3、任意位置插入

``````class Node{
public int data;
public Node next=null;
Node(int data){
this.data=data;
}
}
//头插法
Node node = new Node(data);
return;
}
}
//尾插法
Node node = new Node(data);
return;
}
while (tail.next != null) {
tail = tail.next;
}
tail.next = node;
}
//任意位置插入,第一个数据节点为0号下标
public boolean addIndex(int index, int data) {
int size = getSize();
if (index < 0 || index > size) {
return false;
}
if (index == 0) {
return true;
}
if (index == size) {
return true;
}
Node node = new Node(data);
Node prev = getPos(index - 1);
node.next = prev.next;
prev.next = node;
return true;
}
//获得节点总个数
private int getSize() {
int size = 0;
for (Node cur = head; cur != null; cur = cur.next) {
size++;
}
return size;
}
// 给定 index 下标, 找到对应的节点
private Node getPos(int index) {
for (int i = 0; i < index; i++) {
cur = cur.next;
}
return cur;
}
}
``````

#### 四、单链表的删除操作：

1、删除第一次出现关键字为toRemove的节点。
2、删除所有值为toRemoveAll的节点。

``````class Node{
public int data;
public Node next=null;
Node(int data){
this.data=data;
}
}
//删除第一次出现关键字为toRemove的节点
public void remove(int toRemove) {
return;
}
Node prev = searchPrev(toRemove);
Node toDelete = prev.next;
prev.next = toDelete.next;
}
private Node searchPrev(int toRemove) {
for (Node cur = head; cur != null && cur.next != null; cur = cur.next) {
if (cur.next.data == toRemove) {
return cur;
}
}
return null;
}
//删除所有值为toRemoveAll的节点
public void removeAll(int toRemove) {
while (cur != null) {
if (cur.data == toRemove) {
prev.next = cur.next;
cur = prev.next;
} else {
prev = cur;
cur = cur.next;
}
}
}
}
}
``````

#### 五、单链表的查找操作：

``````class Node{
public int data;
public Node next=null;
Node(int data){
this.data=data;
}
}
public boolean contains(int toFind) {
for (Node cur = head; cur != null; cur = cur.next) {
if (cur.data == toFind) {
return true;
}
}
return false;
}
}
``````

#### 六、单链表清空操作：

``````class Node{
public int data;
public Node next=null;
Node(int data){
this.data=data;
}
}