节点类代替“结构体”:
public class Node {
public String data; //存储数据
public Node next; //连接下一个节点
public Node(String data) {
this.data = data;
}
}
实现单链表的基本方法:
/**
* java单链表的简单实现
*
* @date:2019-2-7
* @author Linging
*
*/
public class ListLink {
public Node first; //声明头节点
public int index; //节点个数
public ListLink() {
this.first = null;
this.index = 0;
}
//初始化头节点
public void Init() {
first = new Node(null);
first.next = null;
}
//头插法插入一个节点
public void insert(String data) {
Node node = new Node(data);
if(first.next == null) {
first.next = node;
index++;
}
else {
node.next = first.next;
first.next = node;
index++;
}
}
//在任意位置插入一个节点
public void everyInsert(int n,String data) {
if(n <= 1) {
insert(data);
}else if(n > index) {
Node node = new Node(data);
Node p = first.next;
while(p.next != null) p=p.next;
p.next = node;
node.next = null;
index++;
}else {
int m = 1;
Node p = first.next;
while(p != null) {
if(m == n-1)
break;
p=p.next;
m++;
}
Node node = new Node(data);
node.next = p.next;
p.next = node;
index++;
}
}
//删除一个节点
public Node delete(int n) {
Node deletenode = first.next;
if( n <= 0 || n > index ) {
System.out.println("没有你要删除的节点索引");return null;
}
if(n == 1) {
first = deletenode.next;
index--;
return deletenode;
}
Node p = first.next,q;
int m = 1;
while(p != null) {
if( n-1 == m )
break;
p=p.next;
m++;
}
q = p.next;
p.next = q.next;
index--;
return q;
}
//查找n索引下的节点
public Node find(int n) {
Node findnode = first.next;
int m = 1;
while(findnode != null) {
if( m == n ) {
return findnode;
}
findnode = findnode.next;m++;
}
return null;
}
//修改index下的节点为x
public void modify(int n,String x) {
find(n).data = x;
}
//打印单链表中的所有节点
public void print() {
Node p = first.next;
while(p != null) {
System.out.println(p.data);
p = p.next;
}
System.out.println("节点个数:"+index);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ListLink lk = new ListLink();
//初始化头节点
lk.Init();
//依次插入节点1,2,3
System.out.println("依次插入节点1、2、3:");
lk.insert("1");
lk.insert("2");
lk.insert("3");
lk.print();
//在第2个节点处插入节点5
System.out.println("\n"+"在第2个节点处插入节点5:");
lk.everyInsert(2, "5");
lk.print();
//删除第4个节点
System.out.println("\n"+"删除第4个节点:");
System.out.println("删除的节点为:"+lk.delete(4).data);
lk.print();
//查找节点
System.out.println("\n"+"查找第2个节点为:"+lk.find(2).data);
//修改节点
System.out.println("\n"+"修改第2个节点为:x");
lk.modify(2, "x");
lk.print();
}
}