java数据结构与算法之单向链表以及三种插入方式

链表概述

        我们在学习之前首先要知道链表是一个什么东西,那它是个啥呢,直接上图简单明了,看图来介绍。

         我们可以清楚的看到这个链有头有尾,最后面是NULL,最前面是头指针,学过C语言指针的同学可以看出java数据结构学习的链表与C语言中的极其相似。其实他们的道理也差不多。怎么构建链表呢,首先链表的主要元素有head头,data数据,next与下一个节点的链接部分。根据这些条件就可以轻松的构建出链表了。

        链表由多个节点组成,每个节点由上图可知包含value和指向下一个节点的指针next,我们可以将一个节点看成一个节点类,value和next分别为类中定义的元素,链表就由许多个节点类组成

代码如下:

public class SingLinkList {//代表链表整体

    private Node head = null;//头指针
     
    //节点类
    private static class Node {
        int value;//值00
        Node next;
        //下一个节点指针,因为下一个元素还是Node所以为Node类型

//有参构造,方便赋值
        public Node(int value, Node next) {
            this.value = value;
            this.next = next;
        }
    }
}

给链表插入元素

头插法

        头插法顾名思义就是从链表的头部开始插入元素,首先肯定要创建一个节点对象,因为链表就是由一个个节点对象组成,怎么连接起来呢,因为现在链表没有值,我们定义了一个头指针,可以让头指针指向这个节点对象,然后如果继续添加的话链表就不为空了,因为从头插入,所以新节点的next指向刚才插入元素的value,新插入的节点就变为1,原来一的就变成了2。代码如下:

 public void addFirst(int value) {
      /*
    首先new 节点对象,值为传入的value,next指向的就是head
    因为链表为空的时候head=null,新插入元素的下一个元素为null
    链表不为空head对应值为第一个元素的值,但是原来的一变成二
    新插入的变为一刚好next为head.
      */
        head = new Node(value, head);

}

尾插法

        尾部插入其实要比头插复杂,尾部插入我们肯定要找到最后面的节点,然后让最后面节点的next指向新插入节点的value,新插入节点的next就变为了null,因为尾部插入。下面为完整代码演示

查找尾部节点代码

尾部节点特点:next—>null

                        

private Node findLast() {
        //首先判断链表是否为空
        if (head == null) {
            return null;
        }
        Node p;
        //循环遍历链表,遍历完成返回节点
        for (p = head; p.next != null; p = p.next) {
        }
        return p;
    }

尾插法代码演示

public void addLast(int value) {
        //调用findLast方法获取要插入链表的最后一个节点
        Node last = findLast();
        if (last == null) {
        //链表为空,尾插就相当于头插
            addFirst(value);
        }
        last.next = new Node(value, null);
    }

向索引位置插入

        向索引位置插入我们首先肯定得获取到索引位置的节点,我们可以通过遍历链表来获得我们需要插入位置的节点,获取节点后,接下来就要插入了。

分为两种情况:

        1.如果索引位置是0的话,我们相当于头插法,直接调用addFirst方法。

        2.索引不为0,我们要在链表中新插入一个节点,我们索引位置就要变成我们插入的节点,原来索引位置上的节点的next节点就是我们新插入节点,我们新插入的节点的next就相当于原来节点的next。看图理解。

代码演示部分:

 //遍历链表查找节点
    private Node findNode(int index){
        int i=-1;
        for(Node p=head;p !=null;p=p.next,i++){
           
            if(i==index){
                return p;
            }
        }
        return null;
    }


 public void insertNode(int index, Integer value){
        if(index==0){
            addFirst(value);
            return;
        }
        Node prev=findNode(index-1);
        if(prev==null){
            System.out.println("你插入的位置有误!!");
        }
        prev.next=new Node(value,prev.next);
    }

        综上所述,就是对链表节点插入的几种方法了,如果有错误,请各位在评论区指出 感谢各位的浏览,接下来的博客会持续更新java数据结构这里的东西,再次感谢各位的浏览。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值