为解决顺序表在插入,删除元素效率低的情况,引入单链表。单链表:使用引用将存储数据单元一次串联起来,避免了数组中用连续的内存存储元素的特点。在每个单元中有两个域,一个用于存储数据,一个用于指向下一个单元的引用。将这种具有一个数据域和多个指针域的存储单元成为节点。
public class MyLinkList<T> {
class Entry{
private T data;
private Entry next;
public Entry(){
this.next = null;
}
public Entry(T data){
this.data = data;
this.next = next;
}
}
private Entry head;
private int size;
public MyLinkList(){//初始化头节点
this.head = new Entry();
}
public int getSize() {
Entry p = head;
int length = 0;
while(p.next != null) {
length++;
p = p.next;
}
return length;
}
public void insert(int pos,T data){
Entry p = new Entry(data);
Entry q = head;
int count = 0;
for(int i = 0;i < pos-1;i++){//找到插入位置的前驱
count++;
q = q.next;
}
p.next = q.next;
q.next = p;
}
public void remove(T data){//按值删除
Entry p = head.next;
while(p != null){//删除位置前驱
if(p.next.data == data){
Entry q = p.next;
p.next = p.next.next;
q.data = null;
}
p = p.next;
}
}
public void change(T olddata,T newdata){//改值
Entry p = head;
while(p.next != null){
if(p.next.data == olddata){
p.next.data = newdata;
}
p = p.next;
}
}
public boolean findValue(T data){//查找
Entry p = head;
while(p.next != null){
if(p.next.data == data){
return true;
}
p = p.next;
}
return false;
}
public void show(){
Entry p = head;
for(p = head.next;p != null;p = p.next){
System.out.println("value:"+p.data);
}
}
public static void main(String[] args){
MyLinkList<Integer> l = new MyLinkList<>();
l.insert(0,4);
l.insert(0,1);
l.insert(1,8);
l.show();
// System.out.println(l.findValue(6));
// l.change(4,3);
// l.show();
l.remove(4);
l.show();
}
}
以上为单链表的基本操作(增删改查),关于逆置,合并等操作详见下一篇博客。