不带头结点的双向链表的操作

在这里插入图片描述结构特点

class DListNode {
    public int val;
    public DListNode pre;
    public DListNode next;

    public DListNode(int val) {
        this.val=val;
    }
}
class DoubleList {
    public DListNode head = null;
    public DListNode last = null;//指向链表的尾巴
    //增删查找
    //头插法     
    public void addFirst(int data);    
    //尾插法    
     public void addLast(int data);    
    //任意位置插入,第一个数据节点为0号下标 
     public boolean addIndex(int index,int data);    
   //查找是否包含关键字key是否在单链表当中   
    public boolean contains(int key);     
    //删除第一次出现关键字为key的节点    
     public void remove(int key);    
     //删除所有值为key的节点     
     public void removeAllKey(int key);     
     //得到单链表的长度    
      public int size();    
      public void display();     
      public void clear(); }
    }

1、头插法:
在这里插入图片描述

//先判断head是否为空
public void addFist(int val) {
        DListNode node=new DListNode(val);
        if(this.head==null) {
              this.head=node;
              this.last=node;
        }else {
            node.next=this.head;
            this.head.pre=node;
            this.head=node;
        }
    }

2、尾插法
在这里插入图片描述``

//尾部插入也要判空
public void addLast(int val) {
        DListNode node=new DListNode(val);

        if(this.head==null) {
            this.head=node;
            this.last=node;
        }else {
            this.last.next=node;
            node.pre=this.last;
            this.last=node;

        }

    }

3、任意位置插入节点

在这里插入图片描述

//判断插入位置是否合法
//index<0||index>size()
//如果插入头部
if(index==0) {
addFirst(data);
}
//如果插入尾部
if(index==size()){
addLast(data);
}
//找到要插入位置的节点
private DListNode searchIndex(int index) {
        if(index<0||index>getLength()) {
            System.out.println("index不合法");
            return null;
        }
        DListNode cur=this.head;
        while(index>0){
            cur=cur.next;
            index--;
        }
        return cur;
    }
    public void addIndex(int index,int val) {

        if(index==0) {
            addFist(val);
            return;
        }
        if(index==getLength()) {
            addLast(val);
            return;
        }
        DListNode cur=searchIndex(index);
        if(cur==null) {
            return;
        }
        DListNode node=new DListNode(val);
        node.next=cur;
        cur.pre.next=node;
        node.pre=cur.pre;
        cur.pre=node;
    }
    
    

4、获取长度

 public int getLength() {
        DListNode cur=this.head;
        int count=0;
        while(cur.next!=null) {
            cur=cur.next;
            count++;
        }
        return count;
    }

5、删除第一次出现关键字为key的节点并返回这个节点

 public int remove(int val) {
        int oldval=-1;
        DListNode cur=this.head;
        while(cur!=null) {
            if(cur.val==val) {
                oldval=cur.val;
                if(head==cur) {
                head=head.next;
                this.head.pre=null;
                return  oldval;
            }else {
                    cur.pre.next=cur.next;
                    if(cur!=this.last) {
                        cur.next.pre=cur.pre;
                    }else {
                        this.last=cur.pre;
                    }
                    return  oldval;
                }
            }
            cur=cur.next;
        }
        return -1;
    }

6、删除出现所有关键字的节点

 public void removeall(int val) {
        int oldval=-1;
        DListNode cur=this.head;
        while(cur!=null) {
            if(cur.val==val) {
                oldval=cur.val;
                if(head==cur) {
                    head=head.next;
                    this.head.pre=null;

                }else {
                    cur.pre.next=cur.next;
                    if(cur!=this.last) {
                        cur.next.pre=cur.pre;
                    }else {
                        this.last=cur.pre;
                    }

                }
            }
            cur=cur.next;
        }
}

7、打印

  public void show() {
        DListNode cur=this.head;
        while(cur!=null) {
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
        System.out.println();
    }

8、清空

public void clear() {

        while(this.head!=null) {
            DListNode cur=this.head;
            this.head.next=null;
            this.head.pre=null;
            this.head=cur;
        }
        this.last=null;
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值