概述
百度百科:单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。 简单来说,链表就是,把一个一个的数据集给串起来,然后形成的串串。数据集在链表中就称为节点
Java中的链表和C语言的比较类似,不过这里我们不需要使用指针
节点: 链表是由节点组成的,一个节点存储的数据分为两部分,第一部分是我们需要存储的数据,另一部分是下一个节点的地址(即引用)。C语言中节点是结构体,在Java中,创建节点类,用对象替代节点。每个节点必须含有一个属性用来指向下一个节点,此属性类型设置为节点类,此属性作用等同于C语言结构体中的next指针,即存储下一个节点对象的地址。 no是编号,name是姓名 头结点: 单链中有一个很重要的节点,即头头节点,单链表,头节点就是一切,没了头节点整个单链表就无法遍历了。头结点可以不存放数据,仅存储下一个节点的地址,也可用存放数据。 我们这里使用头结点仅存储下一个节点的地址。
插入节点(创建)
这里,创建头结点,同时创建一个节点对象,把head节点的地址也赋值为新建的节点,防止直接在head上面动刀 这里为了测试的时候记忆操作,把方法的形参设置为一个数组,到时候传入存放节点的数组,再由此对数组遍历,然后插入节点。
修改
首先接入新节点(形参)
删除
打印链表
测试
所有代码
public class SingleLinkedListDemo {
public static void main(String[] args) {
Node node1=new Node(1,"松江");
Node node2=new Node(3,"吴用");
Node node3=new Node(2,"卢俊义");
Node node4=new Node(3,"吴用");
Node node5=new Node(4,"吴用");
Node node[]={node1,node2,node3,node4,node5};
SingleLinkedList linkedList=new SingleLinkedList();
linkedList.add(node);
linkedList.list();
System.out.println();
linkedList.update(new Node(6,"大头"));
linkedList.list();
System.out.println();
linkedList.delect(3);
linkedList.list();
}
}
class SingleLinkedList{
private Node head=new Node(0,"");
private Node temp;
public void add(Node[] nodeArray){
temp=head;
boolean flag;
for (int i = 0; i < nodeArray.length; i++) {
flag=false;
while(true){
if (temp.next==null){
break;
}
if (temp.next.no>nodeArray[i].no){
break;
}
if (temp.next.no==nodeArray[i].no){
flag=true;
break;
}
temp=temp.next;
}
if (flag){
System.out.println(nodeArray[i].no+"编号重复");
continue;
}else {
nodeArray[i].next=temp.next;
temp.next=nodeArray[i];
}
}
}
public void delect(int no){
if (head.next==null){
System.out.println("链表为空");
return;
}
temp=head;
while (true){
if (temp.next==null){
System.out.println("未找到");
return;
}
if (temp.next.no==no){
break;
}
temp=temp.next;
}
temp.next=temp.next.next;
}
public void list(){
if (head.next==null){
System.out.println("链表空");
}else {
temp=head.next;
while (temp!=null){
System.out.println(temp);
temp=temp.next;
}
}
}
public void update(Node node){
if (head.next==null){
System.out.println("链表为空");
return;
}
Node temp=head.next;
while (true){
if (temp==null){
System.out.println("未找到");
return;
}
if (temp.no==node.no){
break;
}
temp=temp.next;
}
temp.name=node.name;
}
}
class Node{
public int no;
public String name;
public Node next=null;
public Node(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "node{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
注意事项
这里需要多多体会temp用head或head.next的区别差异
|