1.单链表基本操作

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();
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值