数组与链表的比较,链表的创建及其插入删除

数组与链表的区别

数组与链表均为线性表,即一个元素的前继或后驱只有一个元素,为数据结构的基础。
其中数组与链表相比,数组具有按索引查询方便的特点,其查询的时间复杂度为o(1),而链表查询时最坏情况时,所查元素位于链表末端,需查询n次,时间复杂度为o(n)。
链表则具有插入删除方便的特点,无论在什么位置插入,只需将将其next指针改变即可,不需要改变其他元素的位置,而对于数组,则需将其后继元素全部向后移动一个单位,再将元素填入。

链表的创建及其插入删除

链表在创建前,需要定义node的结构体,设置其get、set方法
node的构成有next指针域,和data数据域。

class Node{
    public Node next;

    public void setData(Object data) {
        this.data = data;
    }

    private Object data;
    public Object getData() {
        return data;
    }

    public Node(Object data) {
        this.data = data;
    }
    public Node(){}
}

结点创建结束后,进行链表的创建,链表创建时一般定义其“头结点”或“根节点”。它无具体数据,用来表示第一个元素。

class Linkedlist {
    //链表的根节点,便于使用链表,无数据
     private Node root;

链表的初始化:

public void initLink(){
       //初始化链表,创建根节点
       root=new Node();
       root.next=null;
   }

链表的添加方法,(该方法采用头插法,即在头结点之后插入)

public void link_add(Object data){
       //采用头插法,根节点指向null,新节点的next指向根节点的next,根节点的next指向新节点
       Node pnode=new Node(data);
       pnode.next=root.next;
       root.next=pnode;
       System.out.println("数据:"+data+"添加成功");

   }

链表的插入方法,根据插入的位置进行结点变更,然后进行插入:

public void link_insert(int index,Object data){
       Node pnode=new Node(data);
       Node node=this.root;
       //node为所插结点的前继结点
       int i=1;
       while (i<index){
           node=node.next;
           i++;
       }
       pnode.next=node.next;
       node.next=pnode;
       System.out.println("插入成功");
   }

链表的删除方法,根据要删除的数据内容进行比较,若无数据则抛出异常:

public void link_delete(Object data){
       //删除数据为data的结点
       //定义node为删除结点的前结点
       Node node=new Node();
       node=this.root;
       try {
           while(node.next.getData()!=data&&node.next!=null){
               node=node.next;
           }if(node.next.getData()==data){
               node.next=node.next.next;
               System.out.println("删除成功");
           }else if(node.next==null) System.out.println("数据不存在");

       }catch (Exception e){
           System.out.println("数据不存在");
       }

   }

链表打印,因添加时为头插法,因此与插入顺序相反:

public void link_print(Linkedlist linkedlist){
      // 链表遍历,由于采用头插法,最后元素的next为null,因此while next等于空时退出循环
       Node node = linkedlist.root;
       while(node.next!=null){
           System.out.println(node.next.getData());
           node=node.next;
       }

完整代码:

package List;

class Node{
    public Node next;

    public void setData(Object data) {
        this.data = data;
    }

    private Object data;
    public Object getData() {
        return data;
    }

    public Node(Object data) {
        this.data = data;
    }
    public Node(){}
}

 class Linkedlist {
    //链表的根节点,便于使用链表,无数据
     private Node root;
   public void initLink(){
       //初始化链表,创建根节点
       root=new Node();
       root.next=null;


   }
   public void link_add(Object data){
       //采用头插法,根节点指向null,新节点的next指向根节点的next,根节点的next指向新节点
       Node pnode=new Node(data);
       pnode.next=root.next;
       root.next=pnode;
       System.out.println("数据:"+data+"添加成功");

   }
   public void link_insert(int index,Object data){
       Node pnode=new Node(data);
       Node node=this.root;
       //node为所插结点的前继结点
       int i=1;
       while (i<index){
           node=node.next;
           i++;
       }
       pnode.next=node.next;
       node.next=pnode;
       System.out.println("插入成功");
   }
   public void link_delete(Object data){
       //删除数据为data的结点
       //定义node为删除结点的前结点
       Node node=new Node();
       node=this.root;
       try {
           while(node.next.getData()!=data&&node.next!=null){
               node=node.next;
           }if(node.next.getData()==data){
               node.next=node.next.next;
               System.out.println("删除成功");
           }else if(node.next==null) System.out.println("数据不存在");

       }catch (Exception e){
           System.out.println("数据不存在");
       }

   }
   public void link_print(Linkedlist linkedlist){
      // 链表遍历,由于采用头插法,最后元素的next为null,因此while next等于空时退出循环
       Node node = linkedlist.root;
       while(node.next!=null){
           System.out.println(node.next.getData());
           node=node.next;
       }
       System.out.println("--------------------------");
   }
   public static void main(String[] args)  {
       Linkedlist linkedlist=new Linkedlist();
       linkedlist.initLink();
       linkedlist.link_add(1);
       linkedlist.link_add(2);
       linkedlist.link_add(3);
       linkedlist.link_print(linkedlist);
       linkedlist.link_delete(2);
       linkedlist.link_print(linkedlist);
       linkedlist.link_delete(5);
       linkedlist.link_print(linkedlist);
       linkedlist.link_insert(2,5);
       linkedlist.link_print(linkedlist);
   }


}

输出结果:
测试结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值