【Java数据结构】单链表

结构:

    private static class Node {
        int item;
        Node next;

        Node(int item, Node next) {
            this.item = item;
            this.next = next;
        }
    }

创建:

private Node first;//头结点,不存数据
    private Node last;//指向链表的最后一个节点
    private int size;

    public MyLinkedList() {
        size = 0;
        first = new Node(0, null);
        last = null;
    }

添加:

    /**
     * 添加到链表尾部
     *
     * @param item
     */
    public void add(int item) {
        /********** Begin *********/
        Node node=new Node(item,null);
        if(size==0){
            first.next=node;
            last=node;
            size++;
        }

        else{
            last.next=node;
            last=node;
            size++;}
        /********** End *********/
    }
    /**
     * 添加到链表头部
     *
     * @param item
     */
    public void addhead(int item) {
        /********** Begin *********/
        Node node=new Node(item,null);
        if(size==0){
            first.next=node;
            last=node;
            size++;
        }

        else{
            node.next=first.next;
            first.next=node;
            size++;}
        /********** End *********/
    }
    /**
     * 添加数据item到指定位置index
     * index从0开始
     * @param index
     * @param item
     */
    public void add(int index, int item) {
        checkPosIndex(index);

        /********** Begin *********/
        Node node=new Node(item,null);
        int i=0;
        Node pointer=first;
        if(size==0){
            first.next=node;
            last=node;
            size++;
        }else{
            while(i<index&&pointer.next!=null){
                pointer=pointer.next;
                i++;
            }
            if(pointer.next!=null)
            node.next=pointer.next;
            else{
                last=node;
            }
            pointer.next=node;
            size++;
        }
        /********** End *********/
    }在这里插入代码片

删除:
尤其注意头指针和尾指针和size的变化;其次是注意下标和指针对应起来;
因为睡眠不足而晕乎乎的我写了一堆乱七八糟的东西,给我自己看笑了。

    /**
     * 删除指定位置index处的元素并返回, index从0开始
     * @param index
     * @return
     */
    public int remove(int index) {
        checkPosIndex(index);

        /********** Begin *********/
        int i=-1;
        int m=99999;
        Node hhh=first;
        while(i<index-1&&hhh.next!=null){
            hhh=hhh.next;
            i=i+1;
        }

if(hhh.next!=null){
    m= hhh.next.item;
    hhh.next=hhh.next.next;
    if(index==size-1){
        last=hhh;//要注意last的指针移动
    }

}
        size--;//要注意总长度需要变化
        return m;
        /********** End *********/
    }

查询:

    /**
     * 获取链表中第index个元素
     * @param index
     * @return
     */
    public int get(int index) {
        checkPosIndex(index);
        /********** Begin *********/
        int i=-1;
        Node node=first;
        while(i<index){
            node=node.next;
            i++;
        }
        return node.item;
        /********** End *********/
    }

防止溢出:

    private void checkPosIndex(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
    }

奇码共赏时刻:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值