Java实战:双向链表

import java.util.*;

import static java.lang.Math.*;
//双向链表
public class MyLinkedList<E> {

  private class Node{
    E element;
    Node prev;
    Node next;
    //带参数构造方法
    public Node(E element){
      this.element=element;
    }
  }
  private Node first;
  private  Node last;
  private int count;
  //向集合中添加元素
  public void add(E element){
    Node node=new Node(element);
    if(this.count==0){
      this.first=node;
    }else {
      this.last.next=node;
      node.prev=this.last;
    }
    this.last=node;
    count++;
  }
  //指定位置向集合中添加元素
  public void add(int index,E element){
    Node node=new Node(element);
   if(index>count){
     System.out.print("超出链表长度");
   }else if(index==0){
     this.first.prev=node;
     node.next=this.first;
     this.first=node;
   }else if(count==index){
     this.last.next=node;
     node.prev=this.last;
     this.last=node;
   }else{
     Node target=getNode(index);
     node.next=target;
     node.prev=target.prev;
     target.prev.next=node;
     target.prev=node;
   }
   count++;
  }

  //删除指定下标的元素
  public E remove(int index){
    Node node=getNode(index);
    removeNode(node);
    return  node.element;
  }
 //根据节点中数据进行删除
  public boolean remove(E element){
    Node node=new Node(element);
    if (node==null){
      return  false;
    }
    removeNode(node);
    return true;
  }
  //根据元素获取节点
  private Node getNode(E element){
    Node node=this.first;
    while(node!=null){
      if (node.element.equals(element)){
        return  node;
      }
      node=node.next;
    }
    return null;
  }
  //清空链表
  public void clear(){
    this.first=null;
    this.last=null;
    count=0;
  }
  //将链表中指定下标节点的元素值,修改为指定的值
  public E set(int index,E element){
   Node node=getNode(index);
   E ele=node.element;
   node.element=element;
   //返回修改之前的元素值
   return ele;
  }
  private void removeNode(Node node) {
    if (count==1){
      this.first=null;
      this.last=null;
      count--;
      return;
    }
    if (node==this.first){
      this.first=this.first.next;
      //头节点的前一个的下一个
      this.first.prev.next=null;
      this.first.prev=null;
    }else if(node==this.last){
      this.last=this.last.prev;
      this.last.prev.next=null;
      this.last.next=null;
    }else{
      node.prev.next=node.next;
      node.next.prev=node.prev;
      node.next=null;
      node.prev=null;
    }
    count--;
  }

  //根据下标获取所需节点
  private Node getNode(int index) {
    if(index<0||index>count){
      throw  new IndexOutOfBoundsException("下表越界");
    }
    Node node=this.first;
    for(int i=0;i<index;i++){
      node=node.next;
    }
    return  node;
  }
  //根据下标获取所需元素的值
  private E get(int index){
    Node node=getNode(index);
    return  node.element;
  }
  //链表中节点的个数
  public int size(){
    return  count;
  }
  //判断是否包含某个元素
  public int contains(E element{
    return  indexof(element);
  }
  //返回元素第一次出现的下标
  private int indexof(E element) {
  Node node=this.first;
  for(int i=0;i<count;i++){
    if (node.element.equals(element));
    return i;
  }
  return -1;
  }
  public String toString(){
    if (count==0){
      return null;
    }
      StringBuilder stringBuilder=new StringBuilder("[");
      Node node=this.first;
      for(int i=0;i<count;i++){
        stringBuilder.append(node.element).append(",");
        node=node.next;
      }
      int len=stringBuilder.length();
      stringBuilder.replace(len-2,len,"]");
      return stringBuilder.toString();
  }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值