数据结构(java版)
线性表
单链表
单链表是线性表的链式表示,链表里每一个元素称为一个结点。一个结点里包含指针域和指针(或链),指针域是是存储位置,指针和链里面负责存储信息,这种结点的结合被称为链表。
java实现
先创建结点的类,Node负责指针域,data是储存的信息
package lianbiao;
public class Node {
Node next=null;//node作为指针域初始化置空
int data;//指针域中储存的信息
public Node(int data) {//实现方法
this.data=data;
}
}
接下来是方法和实现
package lianbiao;
public class LianBiao {
Node head = null;
public void addHead(int data) {//添加头结点,链表中第一个空间
Node node = new Node(data);
node.next = head;
head = node;
}
//打印
public void printLink() {//打印这个链表
Node curNode = head;//头结点设为curNode
while (curNode != null) {//如果头结点不为空,则继续循环
System.out.print(curNode.data + " ");
curNode = curNode.next;//把curNode的下个结点设为头结点,循环遍历
}
System.out.println();//循环一次遍历一次,最后全部打印
}
//长度
public int length() {
int length = 0;//链表长度初始置0
Node tmp = head;//头结点指向tmp
while (tmp != null) {//查看tmp是否为空并遍历,
length++;//如果不为空,记录的长度+1
tmp = tmp.next;//检查完一个头结点指向下一个循环遍历直至结束
}
return length;
}
//在尾部插入
public void addLast(int data) {
Node node = new Node(data);//创建一个带有节点的数据
Node temp = head;//头结点指向temp
while (temp.next != null) {//遍历链表直至最后一位
temp = temp.next;
}
temp.next = node;//在遍历到最后一位的后面加上刚刚创建的节点
}
//按索引插入
public void insertByindex(int index, int data) {//输入想要插入的索引和数据
Node node = new Node(data);
if (index < 0 || index > length()) {//检查位置,不能小于0或大于链表长度
System.out.println("位置错误");
return;
}
int length = 1;//如果要插入,链表不可为空,长度应从1开始
Node tmp = head;
while (tmp.next != null) {//若不为0,循环遍历
length++;//从1开始增加,记录长度
tmp = tmp.next;
if (index == length) {//当长度与想要插入的索引位置相同时
node.next = tmp.next;//原位置数据后移
tmp.next = node;//将想要插入的数据插入
return;
}
}
}
//按索引删除
public void deleteByIndex(int index) {
Node temp = head;
if (index < 0 || index > length()) {//检查位置,不能小于0或大于链表长度
System.out.println("位置错误");
return;
} else if (index == 0) {//如果删除第一个位置,头指针指向下一个
head = head.next;
} else {
for (int i = 1; i < index; i++) {//如果删除非第一个位置
temp = temp.next;//将想删除位置的下一个数据指向这个位置
}
temp.next = temp.next.next;//把下一个位置的下一个如法炮制
}
}
public static void main(String[] args) {
LianBiao list = new LianBiao();
list.addHead(22);
list.addHead(33);
list.addLast(1);
list.addLast(3);
list.addLast(4);
list.printLink();
list.insertByindex(2,111);
list.printLink();
list.addLast(999);
list.printLink();
}
}
输出:
33 22 1 3 4
33 22 111 1 3 4
33 22 111 1 3 4 999
进程已结束,退出代码 0
基本功能和顺序表一样,主要是逻辑上的区别,顺序表插入删除需要移动整个数组空间,但是链表仅需要改变指针域,具体解释可以看数据结构严蔚敏版29页。