• java实现线性链表结构


    package com.hephec.ds;


    public class LinkedList<T> {
    //定义一个内部类节点Node Node实例代表链表的节点
    class Node{
    //保存节点的数据
    private T data;
    //保存下一个节点的引用
    private Node next;
    //无參的构造方法
    public Node(){
    }
    //有參的构造方法
    public Node(T data,Node next){
    this.data=data;
    this.next=next;
    }
    }
    //保存该链表的头节点
    private Node header;
    //保存该链表的尾节点
    private Node tail;
    //保存该链表中以及包括的节点数
    private int size;
    //创建空链表
    public LinkedList(){
    //空链表,header,tail都为null
    header=null;
    tail=null;
    }
    //以指定数据元素来创建链表。该链表仅仅有一个元素
    public LinkedList(T element){
    header=new Node(element,null);
    //仅仅有一个节点。header和tail都指向该节点
    tail=header;
    size++;
    }
    //返回链表的长度
    public int length(){
    return size;
    }
    //获取链式线性表中索引为index处的元素
    public T get(int index){
    //?


    return getNodeByIndex(index).data;
    }
    private Node getNodeByIndex(int index) {
    if(index<0||index>size-1){
    throw new IndexOutOfBoundsException("线性表索引越界");
    }
    //从header节点開始
    Node current=header;
    for(int i=0;i<size&&current!=null;i++,current=current.next){
    if(i==index){
    return current;
    }
    }
    return null;
    }

    //查找链式线性表中指定元素的索引
    public int locate(T element){
    //从头结点開始搜索
    Node current=header;
    for(int i=0;i<size-1&&current!=null;i++,current=current.next){
    if(current.data.equals(element)){
    return i;
    }
    }
    return -1;
    }
    //向链式线性表中指定位置插入一个元素
    public void insert(T element,int index){
    if(index<0||index>size){
    throw new IndexOutOfBoundsException("线性表索引越界");
    }
    //假设还是空链表
    if(header==null){
    add(element);
    }
    else{
    //当index=0时,也就是在链表头插入
    if(index==0){
    addAtHeader(element);
    }
    else{
    //获取插入点的前一个节点
    Node prev=(Node) getNodeByIndex(index-1);
    //让prev的next指向新节点
    //让新节点的next引用指向原来prev的下一个节点
    prev.next=new Node(element,prev.next);
    size++;
    }
    }
    }
    //採用头插法为链表加入新节点
    private void addAtHeader(T element) {
    //创建新节点。让新节点的next指向原来的header
    //并以新节点作为新的header
    header=new Node(element,null);
    //假设插入之前是空链表
    if(tail==null){
    tail=header;
    }
    size++;
    }
    //採用尾插法为链表加入新节点
    private void add(T element) {
    //假设该链表还是空链表
    if(header==null){
    header=new Node(element,null);
    //仅仅有一个节点,让header和tail都指向该节点
    tail=header;
    }
    else{
    //创建新节点
    Node newNode=new Node(element,null);
    //让尾节点的next指向新增的节点
    tail.next=newNode;
    //以新节点作为新的尾节点
    tail=newNode;
    }
    size++;
    }
    //删除链式线性表指定索引处的元素
    public T delete(int index){
    if(index<0||index>size-1){
    throw new IndexOutOfBoundsException("数组索引越界");
    }
    Node del=null;
    //假设被删除的是header
    if(index==0){
    del=header;
    header=header.next;
    }
    else{
    //获取删除点的前一个节点
    Node prev=getNodeByIndex(index-1);
    //获取将要被删除的节点
    del=prev.next;
    //让删除节点的next指向被删除节点的下一个节点
    prev.next=del.next;
    del.next=null;

    }
    size--;
    return del.data;
    }
    //刪除鏈式線性表中最後一個元素
    public T remove(){
    return delete(size-1);
    }
    //推断线性表是否为空表
    public boolean isEmpty(){
    return size==0;
    }
    //清空线性表
    public void clear(){
    //header,tail赋值为null
    header=null;
    tail=null;
    size=0;
    }
    public String toString(){
    //推断线性表是否为空
    if(isEmpty()){
    return "[]";
    }
    else{
    StringBuilder sb=new StringBuilder("[");
    for(Node current=header;current!=null;current=current.next){
    sb.append(current.data.toString()+", ");
    }
    int len=sb.length();
    return sb.delete(len-2,len).append("]").toString();

    }

    }

    }



    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    SpringCloud
    SpringCloud
    一个表的字段更新另一个表的字段
    MYSQL5.7 sql_mode=only_full_group_by
    CentOS7 防火墙操作
    log4j DailyRollingFileAppender, DatePattern 配置
    Fiddler抓包-会话框添加查看get与post请求类型选项
    Fiddler抓包-工具介绍(request和response)
    Fiddler抓包-get与post请求
    Fiddler抓包-只抓APP的请求
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4852533.html
Copyright © 2020-2023  润新知