zoukankan      html  css  js  c++  java
  • 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();

    }

    }

    }



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

  • 相关阅读:
    【BZOJ4517】排列计数(排列组合)
    【BZOJ2733】永无乡(线段树,启发式合并)
    【BZOJ1237】配对(贪心,DP)
    【BZOJ1492】货币兑换Cash(CDQ分治)
    CDQ分治模板
    【BZOJ3932】任务查询系统(主席树)
    【BZOJ3295】动态逆序对(BIT套动态加点线段树)
    【BZOJ3626】LCA(树上差分,树链剖分)
    图书管理系统
    树集合,树映射
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4852533.html
Copyright © 2011-2022 走看看