JAVA单链表的简单操作(递增单链表插入数据,链表逆置,链表逆序合成)

JAVA写一个单链表

1、已知带头结点的动态单链表 L 中的结点是按整数值递增排序的,试写一 算法将值为 x 的结点插入到表 L 中,使 L 仍然有序。要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

2、设计一算法,逆置带头结点的动态链表 L。要求利用原表的结点空间, 并要求用尽可能少的时间完成。

3、假设有两个按元素值递增有序的线性表 A 和 B,均以单链表作存储结构, 试编写算法将 A 表和 B 表归并成一个按元素值递减有序的线性表性表 C,并要求 利用原表的空间存放 C,并要求用尽可能少的时间完成。

如何插入一段漂亮的代码片

  • 要求一:不破坏表的顺序插入元素,时间复杂度O(n)
    一个for循环即可解决
//     
public void Insert_order(int e){
   
        Node current = header;
        if(header == null) //空表直接尾部加
            add(e);//在尾部添加元素
        int i;
        for(i=0;i<size&&current!=null;i++,current=current.next){
   
            if(current.data>=e){
   //如果某个结点的指大于等于输入值
                if(i==0) {
   //如果是在头节点,直接加在前面
                    addHead_e(e);//在头部添加元素
                    break;
                }
                Node p=this.getNodeByIndex(i-1);//指定位置的前一个节点
                p.next=new Node(e,p.next);//这是不在首位的情况,获取当前节点的前一个节点并将e插在它后面,同时新节点的指向是原节点的下一个节点
                size++;
                break;
            }
        }
        if(i==size)//如果循环没有被break结束,那么i的值与size的值相等,
            add(e);//这说明这个元素比原链表中任何一个都大,直接在尾部添加节点即可
        //System.out.println(size);

    }

用到的add(e)和addHead_e(e)方法:

//直接在尾部插入元素
    public void add(int e){
   
        if(header==null) {
   
            header = new Node(e, null);
            tail = header;
        }
        else{
   
            Node p=new Node(e,null);
            tail.next=p;
            tail=p;
        }
        size++;
    }
    //在表头插入元素
    public void addHead_e(int e){
   
        Node p=new Node(e,null);
        p.next=header;
        header=p;
        if(header.next==null)
            tail=header;
        size ++;
    }

用到的getNodeByIndex(index)方法:

    // 获取指定节点
   private Node getNodeByIndex(int index){
   
       if(index < 0 || index >= size)
           throw new IndexOutOfBoundsException("索引超出线性表范围");
       Node current = header;//从header开始遍历

       for(int i=0; i<size && current!=null; i++,current=current.next){
   
               if(i == index)
                   return current;
       }
       return null;
   }
  • 要求2:逆置带头结点的动态单链表 L
    一共有三种方法,这里选择的是迭代法
    事实上这里可以不需要返回值的,截至到header=p就可以了
    具体结合实际应用
//逆置(迭代法)
   /*
   1.先将当前节点的下一节点记录下来,
   2.然后将当前节点指向上一节点
   3.再将当前节点记录下来,让记录的下一节点变成当前节点
   * */
   public Node ReverseLink1(){
   
       
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值