[数据结构]无头结点单链表JAVA

文章介绍了Java编程中的ListLink接口和ListNode实现,重点讲解了链表的基本操作如头插、尾插、指定位置插入、删除、遍历以及内存管理,强调了对头节点、边界值和内存溢出问题的处理。
摘要由CSDN通过智能技术生成

注1:仅做出简单的增删改查功能,对于重复的遍历可以自己做出响应的修改调用,部分未做出边界值的测试。

注2:对于头结点和头指针需弄清,避免在算法的撰写上做出不必要的错误

注3:对于链表的删除,是否在内存中是否仍存在需要理解,避免在C/C++等算法时内存溢出问题。

接口:

 

/**
 * @author: hj
 * @version:1.0
 * @className: ListLink
 * @Describe:
 * @Date: Created in 2024/3/11
 */
public interface ListLink {
    void InsertHeadNode(int num);   //头插
    void InsertCurNode(int num);    //尾插
    void InsertIndexNode(int index, int num);   //指定位置插入
    int SearchIndexNode(int index);  //输出指定位置节点值
    void PrintNode();   //输出所有节点
    boolean DelIndexNode(int index);    //删除指定位置节点
    void DelLinkList();     //清空所有链表
    void Clear();   //防止内存溢出的清除方法
    boolean ModifyNode(int index, int num);    //修改指定节点的数值;
    int Length();
}

实现类:

/**
 * @author: hj
 * @version:1.0
 * @className: ListNode
 * @Describe:  未使用头结点单链表
 * @Date: Created in 2024/3/11
 */
public class ListNode implements ListLink {

    private int val;    //数据域
    private ListNode next;  //指针域
    private int size = 0;   //记录链表长度
    //头指针永远指向链表的第一个元素:头结点【声明了头结点则指向头结点】/首元结点
    //头指针只声明,没有开辟空间
    //头结点声明并开辟了空间
    private ListNode headNode;  //头指针

    public ListNode(){}

    public ListNode(int val){
        this.val = val;
    }

    public ListNode(int val, ListNode next){
        this.val = val;
        this.next = next;
    }

    /**
     * @Description 头插法
     * @author hj
     * @date 2024/3/11 15:15
     * * @param null
     *
     */
    @Override
    public void InsertHeadNode(int num) {
        //创建新的节点并开辟
        ListNode newNode = new ListNode(num);
        //若为空链表则直接插入头节点后
        //若不为空链表则将创建的新结点的指针域指向headNode的下一个结点
        //同时更新headNode的指针域,使其指向新结点
        if (headNode == null){
            headNode = newNode;
        }else {
            ListNode tempHeadNode = headNode;
            newNode.next = tempHeadNode;
            headNode = newNode;
        }
        this.size++;
        //System.out.println("success!");
    }

    /**
     * @Description 尾插法
     * @author hj
     * @date 2024/3/11 17:20
     * * @param null
     *
     */
    @Override
    public void InsertCurNode(int num) {
        //创建新结点
        ListNode newNode = new ListNode(num);
        if (headNode == null){
            headNode = newNode;
        }else {
            ListNode tempHeadNode = headNode;
            while (tempHeadNode.next != null){
                tempHeadNode = tempHeadNode.next;
            }
            tempHeadNode.next = newNode;
        }
        this.size++;
    }

    /**
     * @Description 指定位置后插入
     * @author hj
     * @date 2024/3/11 17:25
     * * @param null
     *
     */
    @Override
    public void InsertIndexNode(int index, int num) {
        //越界则退出
        if (index < 1 || index > this.size){
            System.out.println("Crossed!");
            return;
        };

        //创建新结点,并在尾处插入
        ListNode newNode = new ListNode(num,null);
        ListNode tempIndexNode = headNode;
        int i = 1;
        while ( i != index){
            tempIndexNode = tempIndexNode.next;
            i++;
        }
        newNode.next = tempIndexNode.next;
        tempIndexNode.next = newNode;
        this.size++;
        System.out.println("successfully insert!");
    }

    /**
     * @Description 输出指定位置结点数值
     * @author hj
     * @date 2024/3/11 17:29
     * * @param null
     *
     */
    @Override
    public int SearchIndexNode(int index) {
        //若越界则输出-1
        if (index < 1 || index > this.size) return -1;

        //遍历到指定位置,输出数值
        ListNode tempIndexNode = headNode;
        int i = 1;
        while (i != index){
            tempIndexNode = tempIndexNode.next;
            i++;
        }
        return tempIndexNode.val;
    }

    /**
     * @Description 遍历
     * @author hj
     * @date 2024/3/11 15:15
     * * @param null
     *
     */
    @Override
    public void PrintNode() {
        ListNode tempIndexNode = headNode; //创建临时指针,用于当作遍历指针
        if (tempIndexNode == null) System.out.println("This is an empty List");
        while (tempIndexNode != null) {
            System.out.print(tempIndexNode.val +"\t");
            tempIndexNode = tempIndexNode.next;
        }
    }

    /**
     * @Description 删除指定结点
     * @author hj
     * @date 2024/3/11 15:15
     * * @param null
     *
     */
    @Override
    public boolean DelIndexNode(int index) {
        //删除失败,越界
        if (index < 1 || index > size) return false;
        //删除头结点
        if (index == 1){
            headNode = headNode.next;
            return true;
        }
        //删除头结点以外的
        ListNode preIndexNode = headNode;
        ListNode curIndexNode = headNode.next;
        int i = 2;
        while (curIndexNode != null){
            if (i == index) {
                preIndexNode.next= curIndexNode.next;
                this.size--;
                return  true;
            }
            preIndexNode = curIndexNode;
            curIndexNode = curIndexNode.next;
            i++;
        }
        return false;
    }

    /**
     * @Description 列表全清空[仅指针null,内存中实际存在原元素]
     * @author hj
     * @date 2024/3/11 15:16
     * * @param null
     *
     */
    @Override
    public void DelLinkList() {
        headNode = null;
        this.size = 0;
    }

    /**
     * @Description 更改结点数值
     * @author hj
     * @date 2024/3/11 17:32
     * * @param null
     *
     */
    @Override
    public boolean ModifyNode(int index, int num) {
        if (index > this.size || index < 1)  return false;

        ListNode indexNode = headNode;
        int j = 1;
        while (j != index){
            indexNode = indexNode.next;
            j++;
        }
        indexNode.val = num;
        return true;
    }

    @Override
    public int Length() {
        return this.size;
    }

    /**
     * @Description  从头结点开始挨个删除所有元素,避免内存溢出
     * @author hj
     * @date 2024/3/12 12:44
     * * @param null
     *
     */
    @Override
    public void Clear() {
        if (headNode.next != null){
            ListNode cur = this.headNode.next;
            this.headNode.next = null;
            this.headNode = cur;
        }
        //制空headNode
        headNode.next = null;
        this.headNode = null;
        this.size = 0;
        System.out.println(this.size);
    }
}

测试用例需要自己安排并进行输出。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值