Java 手写单向链表

这篇博客详细介绍了如何使用Java实现链表数据结构,包括创建链表、在链表尾部添加节点、删除指定位置的节点以及打印链表内容的方法。通过示例代码展示了链表操作的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.yang.com;

public class MyLinkedList {
    //定义一个头节点
    Node head;
    //链表的长度
    int size;

    class Node {
        //真实数据
        int data;
        //next指针,指向下一个节点对象
        Node next;

        //构造函数
        public Node(int data) {
            this.data = data;
        }
    }

    //增加节点,顺序插入,也就是在尾部追加数据
    public void addNode(int data) {
        //头节点处理                     如果头节点为null,那么直接将data放入头节点里
        if (head == null) {
            head = new Node(data);
            size++;
            return;
        }
        //遍历到尾节点                    如果头节点不为null,那么直接生成一个临时节点,将头节点赋予临时节点
        Node temp = head;               //赋予临时节点
        while (temp.next != null) {     //遍历到尾节点,如果 next 不为null,那么一直往后遍历,直到取到末节点
            temp = temp.next;
        }
        //跳出循环,尾节点找到
        //找到尾节点,赋值
        temp.next = new Node(data);     //将尾节点的next元素设置为data
        size++;                         //链表长度+1
    }

    public Node deleteNode(int index) { //删除节点方法
        //处理空链表
        if (size == 0) {                //如果size==0代表空链表,直接返回null就okay
            return null;
        }
        //处理异常索引
        if (index < 1 || index > size) {//处理索引异常判断
            return null;
        }
        //删除头节点
        if (index == 1) {               //索引为1
            Node temp = head;           //将头节点赋予临时节点
            head = head.next;           //将头节点的next节点变为头节点
            size--;
            return temp;
        }
        //删除非头节点
        //从头节点的下一个节点开始遍历
        Node cureNode = head.next;
        //记录当前循环的节点的上一个节点用于删除当前节点
        Node preNode=head;
        int i=2;
        while(cureNode!=null){
            if(i==index){               //判断是否删除该元素
                //要删除的就是此节点
                preNode.next=cureNode.next;
                size--;
                break;
            }else{                      //else将当前节点重新赋值,并将 i++
                preNode=cureNode;
                cureNode=cureNode.next;
                i++;
            }
        }
        return cureNode;
    }

    //打印链表
    public void printList(){
        Node curNode=head;
        //循坏遍历到尾节点
        while(curNode!=null){
            System.out.print(curNode.data+" ");
            curNode=curNode.next;
        }
        System.out.println();
    }

    //返回链表长度
    public int getSize(){
        return size;
    }

    public static void main(String[] args) {
        MyLinkedList myLinkedList=new MyLinkedList();
        myLinkedList.addNode(10);
        myLinkedList.addNode(20);
        myLinkedList.addNode(30);
        myLinkedList.printList();
        System.out.println("链表长度= "+myLinkedList.getSize());
        System.out.println("------------删除链表-------------");
        Node node = myLinkedList.deleteNode(3);
        System.out.println("删除的节点数据是:"+node.data);
        myLinkedList.printList();
        System.out.println("链表长度= "+myLinkedList.getSize());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值