链表
链表是一个可以把一组内存串联在一起的数据结构,每一块内存被叫做结点,每个结点不光存储数据本身,还需要存储下一个节点的引用。最后一个结点指向NULL。
代码实现
定义单链表时,通过头结点(链表的第一个结点)来定义,拿到了头结点的引用就相当于拿到了链表。
添加
- 如果头结点为NULL,将新增元素定义为头结点。
- 如果头结点不为NULL,从头结点开始迭代链表,当某个结点的next指向NULL时,说明该结点为尾结点,将该结点的next指向新增结点即可。
删除
- 如果删除的是头结点,直接让头结点的下一个结点作为头结点(头结点指向头结点的下一个结点)。
- 如果删除的不是头结点,从头结点开始迭代链表,找到要删除的结点后,让该结点的前一个结点指向该节点的后一个结点(注意不要丢了引用)。
public class Link {
class Node {
public int data;
public Node next = null;
public Node(int data){
this.data = data;
}
}
public Node header = null;
//新增链表元素
public void add(int data){
if(header == null) {
header = new Node(data);
return;
}
Node temp = header;
while (temp.next != null){
temp = temp.next;
}
temp.next = new Node(data);
}
//删除链表中指定元素
public void delete(int data) {
if(header == null) {
return;
}
//如果删除的元素正好是头结点
if(header.data == data){
header = header.next;
return;
}
Node pre = null;
Node temp = header;
while (temp.next != null){
pre = temp;
temp = temp.next;
if(temp.data == data) {
pre.next = temp.next;
return;
}
};
}
//打印链表所有元素
public void printAll(){
printAll(this.header);
}
public void printAll(Node header){
if(header == null){
return;
}
Node temp = header;
System.out.println(temp.data);
while (temp.next != null){
System.out.println(temp.next.data);
temp = temp.next;
}
}
}
测试:
public static void main(String[] args) {
Link link = new Link();
link.add(1);
link.add(2);
link.add(3);
link.add(4);
link.add(5);
link.delete(4);
link.printAll();
}