1、单链表
链表是最基本的数据结构,存储原理如图:
图中展示了一个单链表的存储原理。head为头节点,它不存放任何数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,每个节点中都有一个next引用,指向下一个节点,以此类推,直到最后一个节点的next指向null。
2、单链表实现(Java)
2.1、编写一个Node类充当结点的模型。其中有两个属性,①存放数据的data,②存放下一个结点的引用。
public class Node{
// 为了方便,这两个变量都使用public
// 存放数据的变量,简单使用int型
public int data;
// 存放结点的变量,默认为null
public Node next; // 构造方法,在构造时就能给data赋值
public Node(int data){
this.data = data;
}
}
2.2、单链表的简单操作(增加、删除、获取总长度、链表元素排序、链表遍历)
head
addNode(Node):void 增加节点
insertNodeByIndex(int,Node):void 插入节点到指定位置
delNodeByIndex(int):void 删除指定位置的结点
selectSortNode():void 通过选择排序对链表进行排序
insertSortNode():void 通过插入排序对链表进行排序
length():int 链表的长度
print():void 打印链表中的所有结点的data
main(String[]):void
2.2.1、增加结点操作,addNode(Node)
/**
*增加操作
* 直接在链表的最后插入新增的结点即可
* 将原本最后一个结点的next指向新结点
**/
public void addNode(Node node){
// 链表中有结点,遍历到最后一个结点
Node temp = head; //一个移动的指针(把头结点看做一个指向结点的指针)
while(temp.next != null){ //遍历单链表,直到遍历到最后一个则跳出循环
temp = temp.next; //往后移一个结点,指向下一个结点。
}
temp.next = node; //temp为最后一个结点或者是头结点,将其next指向新结点。
}
2.2.2、插入结点到链表的指定位置,insertNodeByIndex(int index,Node node)
/**
*insertNodeByIndex:在链表的指定位置插入结点
* 插入操作需要知道1个结点即可,当前位置的前一个结点
*index:插入链表的位置,从1开始
*node:插入的结点
**/
public void insertNodeByIndex(int index,Node node){
// 首先判定指定位置是否合法
if(index<1||index>length()+1){
System.out.println("插入的位置不合法");
return;
} int length = 1; //记录我们遍历到第几个结点了,也就是记录位置。
Node temp = head; //可移动的指针
while(head.next != null){ //遍历单链表
if(index == length++){ //判断是否达到指定位置
// 注意,我们的temp代表的是当前位置的前一个结点
//前一个结点 当前位置 后一个结点
//temp temp.next temp.next.next
node.next = temp.next;
temp.next = node;
return;
}
temp = temp.next;
} }
2.2.3、删除指定位置上的结点 delNodeByIndex(int index)
/**
*通过index删除指定位置的结点,跟指定位置增加结点是一样的,先找到准确的位置。然后进行删除操作。
* 删除操作需要知道1个结点即可:和当前位置的前一个结点。
*@param index: 链表中的位置,从1开始
**/
public void delNodeByIndex(int index){
//判断index是否合理
if(index<1 || index>length()){
System.out.println("给定的位置不合理");
return;
} // 步骤跟insertNodeByIndex是一样的,只是操作不一样。
int length=1;
Node temp = head;
while(temp.next != null){
if(index == length++){
//删除操作
temp.next = temp.next.next;
return;
}
temp = temp.next;
}
}
2.2.4、计算单链表的长度
/**
*计算单链表的长度,也就是有多少个结点
*return 结点个数
**/
public int length(){
int length =0;
Node temp = head;
while(temp.next != null){
length++;
temp = temp.next;
}
return length;
}
2.2.5、遍历单链表,打印data
/**
*遍历单链表,打印所有data
**/
public void print(){
Node temp = head.next;
while(temp != null){
System.out.print(temp.data+",");
temp = temp.next;
}
System.out.println();
}