欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java数据结构之双端链表原理与实现方法

程序员文章站 2024-04-02 07:58:46
本文实例讲述了java数据结构之双端链表原理与实现方法。分享给大家供大家参考,具体如下: 一、概述: 1、什么时双端链表: 链表中保持这对最后一个连点引用的链表 2...

本文实例讲述了java数据结构之双端链表原理与实现方法。分享给大家供大家参考,具体如下:

一、概述:

1、什么时双端链表:

链表中保持这对最后一个连点引用的链表

2、从头部插入

要对链表进行判断,如果为空则设置尾节点为新添加的节点

3、从尾部进行插入

如果链表为空,则直接设置头节点为新添加的节点,否则设置尾节点的后一个节点为新添加的节点

4、从头部删除

判断节点是否有下个节点,如果没有则设置节点为null

二、具体实现

/**
 * @描述     头尾相接的链表
 * @项目名称   java_datastruct
 * @包名     com.struct.linklist
 * @类名     linklist
 * @author   chenlin
 * @date    2010年6月26日 上午8:00:28
 * @version   1.0
 */
public class firstlastlinklist {
  //头
  private node first;
  //尾
  private node last;
  public firstlastlinklist(){
    first = null;
    last = null;
  }
  /**
   * 插入数据
   * @param value
   */
  public void insertfirst(long value){
    node newnode = new node(value);
    if (first == null) {
      last = newnode;
    }else {
      //把first节点往下移动
      newnode.next = first;
    }
    //把插入的节点作为新的节点
    first = newnode;
  }
  /**
   * 插入数据
   * @param value
   */
  public void insertlast(long value){
    node newnode = new node(value);
    if (first == null) {
      first = newnode;
    }else {
      last.next = newnode;
    }
    //把最后个节点设置为最新的节点
    last = newnode;
  }
  public boolean isempty(){
    return first == null;
  }
  /**
   * 删除头节点
   * @param value
   * @return
   */
  public node deletefirst(){
    if (first == null) {
      throw new runtimeexception("链表数据不存在");
    }
    if (first.next == null) {
      last = null;
    }
    node temp = first;
    first = temp.next;
    return temp;
  }
  public node deletebykey(long key){
    node current = first;
    node last = first;
    while(current.data != key){
      if (current.next == null) {
        system.out.println("没找到节点");
        return null;
      }
      last = current;
      current = current.next;
    }
    if (current == first) {
      //return deletefirst();
      //指向下个就表示删除第一个
      first = first.next;
    }else {
      last.next = current.next;
    }
    return current;
  }
  /**
   * 显示所有的数据
   */
  public void display(){
    if (first == null) {
      //throw new runtimeexception("链表数据不存在");
      return;
    }
    node current = first;
    while(current != null){
      current.display();
      current = current.next;
    }
    system.out.println("---------------");
  }
  /**
   * 查找节点1
   * @param value
   * @return
   */
  public node findbyvalue(long value){
    node current = first;
    while(current != null){
      if (current.data != value) {
        current = current.next;
      }else {
        break;
      }
    }
    if (current == null) {
      system.out.println("没找到");
      return null;
    }
    return current;
  }
  /**
   * 查找节点2
   *
   * @param key
   * @return
   */
  public node findbykey(long key) {
    node current = first;
    while (current.data != key) {
      if (current.next == null) {
        system.out.println("没找到");
        return null;
      }
      current = current.next;
    }
    return current;
  }
  /**
   * 根据索引查找对应的值
   * @param position
   * @return
   */
  public node findbyposition(int position){
    node current = first;
    //为什么是position - 1,因为要使用遍历,让current指向下一个, 所以position - 1的下个node就是要找的值
    for (int i = 0; i < position - 1 ; i++) {
      current = current.next;
    }
    return current;
  }
  public static void main(string[] args) {
    firstlastlinklist linklist = new firstlastlinklist();
    linklist.insertfirst(21);
    linklist.insertfirst(22);
    linklist.insertfirst(23);
    linklist.insertlast(24);
    linklist.insertlast(25);
    linklist.insertlast(26);
    linklist.insertlast(27);
    linklist.display();
    system.out.println("---查找-------------------------------------");
    linklist.findbykey(25).display();
    system.out.println("--删除first-------------------------------------");
    //linklist.deletefirst().display();
    ///linklist.deletefirst().display();
    //linklist.deletefirst().display();
    //linklist.deletefirst().display();
    system.out.println("-删除指定值---------------------------------------");
    linklist.deletebykey(27).display();
    linklist.deletebykey(21).display();
    system.out.println("----------------------------------------");
    linklist.display();
  }
}

更多关于java算法相关内容感兴趣的读者可查看本站专题:《java数据结构与算法教程》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。