1.单链表基本操作
- 链表的核心操作集有 3 种:插入、删除、查找(遍历)
- 单链表 [Linked List]:由各个内存结构通过一个 Next 指针链接在一起组成,每一个内 存结构都存在后继内存结构(链尾除外),内存结构由数据域和 Next 指针域组成。
单链表实现图示:
解析:
- Data 数据 + Next 指针,组成一个单链表的内存结构 ; 第一个内存结构称为 链头,最后一个内存结构称为 链尾; 链尾的 Next 指针设置为 NULL [指向空]; 单链表的遍历方向单一(只能从链头一直遍历到链尾)
单链表节点结构
package demo16;
//单链表节点结构
//java中单链表节点使用Node实体类表示,只有后续没有前继
public class Node {
Node next=null;//next指针指向下一个节点,初始为null
int data; //节点数据
public Node() { }
public Node( int data) {
this.data = data;
}
}
单链表基本操作
package demo16;
//单链表的增删改查
public class MyLinkedList {
//头指针:标识头结点(始终指向),单链表每次操作都要从头结点开始,初始化为null
Node head = null;
/**
* 添加节点
* 创建一个节点,判断是否有头节点,没有头节点那么创建的节点就是头节点,
* 下一次再创建节点,头节点已经有了,就从头节点循环遍历直到最后一个节点,
* 然后把新创建的节点挂在最后一个节点上。
*
* @param data
*/
public void addNode(int data) {
Node node = new Node(data);//创建节点,向节点存入数据
//节点接入链表中
//若是空链表
if (head == null) {
head = node; //头指针指向头结点
return;
}
//若不是空链表
Node temp = head;//temp做临时变量,替代head移动,进行遍历
while (temp.next != null) {
temp = temp.next; //向后移动一个节点,temp指向当前节点的下一个节点
}
//找到链表最后一个节点,将新节点挂在其后
temp.next = node;
}
/**
* 删除节点
* 1.判断删除的节点是否在链表中
* 2.判断删除的链表是否是头结点,是则更新头结点,不是则遍历,通过index确定删除节点
* 3.由于不是双链表,需要变量时刻记录当前节点curNode的前一个节点preNode
*
* @param index
* @return
*/
public boolean deleteNode(int index) {
if (index < 1 || index > nodeLength()) return false; //节点不存在
if (index == 1) {//删除头结点
head = head.next;
return true;
}
int count = 2;//标识当前节点在链表中位置
Node preNode = head;//preNode指向当前节点前一个节点
Node curNode = head.next;//curNode指向当前节点
while (curNode != null) {
if (count == index) {//找到节点
preNode.next = curNode.next;//preNode指向当前节点下一个节点完成删除
return true;
}
//当前节点不是目标节点,则preNode和curNode分别后移分别指向各自下一个节点
preNode = preNode.next;
curNode = curNode.next;
count++;
}
return true;
}
/**
* 链表长度
* 1.若head为空(未指向任何节点),空链表
* 2.若head不为空,临时变量temp替代head循环遍历链表
*
* @return
*/
public int nodeLength() {
int count = 1;//计数器
if (head == null) return 0;//空链表
Node temp = head;
while (temp.next != null) {
temp = temp.next;//temp指向下一个节点
count++;
}
return count;
}
/**
* 输出链表
* 1.先判断链表是否为空,不为空则遍历链表
*/
public void printLinkedList(){
if (head==null) System.out.println("链表为空");
Node temp=head; //temp指向头结点,使用temp代替head进行移动,遍历
while(temp!=null){
System.out.print(temp.data+" ");
temp=temp.next;
}
System.out.println();
}
}
测试类
package demo16;
public class Test {
public static void main(String[] args) {
MyLinkedList myLinkedList = new MyLinkedList();
//添加链表节点
myLinkedList.addNode(5);
myLinkedList.addNode(4);
myLinkedList.addNode(3);
myLinkedList.addNode(2);
myLinkedList.addNode(1);
myLinkedList.printLinkedList();
myLinkedList.deleteNode(2);
myLinkedList.printLinkedList();
}
}