java实现单链表的增删改查
链表: 链表是由节点组成的,节点是next域连接起来的,每个节点=data+next,同时链表在内存中是不连续的。
特点:
1.访问某个特定的节点,从头开始去找
2.删除、添加某一个特定的节点到某一个位置,只需要找到前一个节点,即可直接添加或删除
3.链表是一种内存上不连续的数据结构
创建一个单链表
protected Node<E> head;//头节点
class Node<E>{
protected E data;//数据域
protected Node<E> next;//next引用域
public Node(E data, Node<E> next){
this.data = data;
this.next = next;
}
}
链表的插入: 链表的插入操作分为头插法、尾插法和固定位置插入三种方法
头插法:
//初始化head
public SingleLinekdListTakeHead(){
head = new Node(new Object(), null);
}
//在head之后直接插入一个节点,头插法
public void addHead(E element){
Node<E> newNode = new Node(element, null);
newNode.next = head.next;
head.next = newNode;
}
尾插法:
public void addTail(E element){
Node<E> newNode = new Node(element, null);
Node<E> tail = head;
//tail走到当前链表的尾部
while(tail.next != null){
tail = tail.next;
}
tail.next = newNode;
}
固定位置插入:
public void addPos(int pos, E element){
//参数的合法性
if(pos <= 0 || pos > this.getLength()){
return;
}
//找到pos位置的前一个节点
int index = 1;
Node<E> prev = head.next;
while(index++ < pos-1){
prev = prev.next;
}
//创建新节点
Node<E> newNode = new Node(element, null);
//绑定新节点
newNode.next = prev.next;
prev.next = newNode;
}
查询链表中有效节点个数
public int getLength(){
Node<E> tmp = head.next;
int length = 0;
while(tmp != null){
length ++;
tmp = tmp.next;
}
return length;
}
链表的删除操作
public boolean remove(E element){
if(head.next == null){
return false;
}
//找到该元素所对应的节点 + 该元素所对应的节点的前一个
Node<E> tmp = head;
while(tmp != null){
if(tmp.next != null && tmp.next.data == element){
//tmp.next是我们要删除的节点 tmp是删除节点的前一个
tmp.next = tmp.next.next;
return true;
}
tmp = tmp.next;
}
return false;
}
链表的修改操作
public boolean set(int pos, E newElement){
if(pos <= 0 || pos > getLength()){
return false;
}
//找pos位置的节点
Node<E> tmp = head.next;
for(int i=1; i < pos; i++){
tmp = tmp.next;
}
tmp.data = newElement;
return true;
}
链表的查询操作
public E get(int pos){
if(pos <= 0 || pos > getLength()){
return null;
}
int index = 1;
Node<E> prev = head.next;
while(index++ < pos){
prev = prev.next;
}
return prev.data;
}