java-------单链表

单链表:
* 1.链表可以是一种有序或无序的列表
* 2.链表的内容通常存储在内存中分散的为止
* 3.链表由节点组成,每一个节点具有相同的结构
* 4.节点分为数据域和链域,数据域存放节点内容,链域存放下一个节点的指针

package myLinkList;

public class MyLinkedList<T> {

/**
*Node:节点对象
* 包括数据域data和链域next(指向下一个节点对象)
*/
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 tailer;//链表尾节点
private int size;//链表长度(节点个数)

/**
* 链表初始化
*/
public MyLinkedList() {//空参构造
  header = null;
  tailer = null;
}
public MyLinkedList(T data) {//有参构造
  header = new Node(data,null);//创建头结点
  tailer = header;
  size++;
}

/**
* 求链表长度
* @return
*/
public int getSize() {
  return size;
}

/**
* 返回索引为index的节点的数据
* @param index 索引
* @return
*/
public T get(int index) {
  if(index < 0 || index > size-1)
    throw new IndexOutOfBoundsException("索引越界");
  return getIndexNode(index).data;
}

public Node getIndexNode(int index){
  if(index < 0 || index > size-1)
    throw new IndexOutOfBoundsException("索引越界");
  Node current = header;
  for(int i = 0;i < size; i++) {
    if(i == index) {
    return current;
  }
  current = current.next;
}
  return null;
}

/**
* 返回element在在链表位置,如果不存在,则返回-1
* @param tdata
* @return
*/
public int getIndex(T element) {
  if(element == null)
    return -1;
  Node current = header;
  for(int i = 0; i < size; i++) {
    if(current.data == element){
    return i;
  }
  current = current.next;
}
  return -1;
}

/**
* 在链表末端添加element
* @param element
*/
public void add(T element) {
  Node n = new Node(element,null);
  if(header == null){
  header = n;
  tailer = header;
}else{
  tailer.next = n;
  tailer = n;
}
  size++;
}

/**
* 在链表头部添加element
* @param element
*/
public void addAtheader(T element) {
  header = new Node(element,header);
  if(tailer == null){
    tailer = header;
  }
  size++;
}

/**
* 在index位置后边插入元素
* @param index
* @param element
*/
public void insert(int index,T element) {
  if(index<0 || index>size-1) {
    throw new IndexOutOfBoundsException("索引越界");
  }
  if(header==null){
    add(element);
  }else{
    if(index==0){
    addAtheader(element);
  }else{
      Node current = getIndexNode(index);
      Node insertNode = new Node(element,current.next);
      current.next = insertNode;
      size++;
    }
  }
}
/**
* 删除任意位置的节点
* @param index
* @return
*/
public T deleteNode(int index){
  if(index<0 || index>size-1)
    throw new IndexOutOfBoundsException("索引越界");
  if(index == 0){//在头部删除元素
    Node n = header;//记录头节点
    header = header.next;//将头指针指向下一个节点
    size--;
    return n.data;//输出记录节点的内容
  }else{//在其他位置删除
    Node current = getIndexNode(index);//获取当前节点
    Node pre = getIndexNode(index-1);//获取前一个节点
    pre.next = current.next;//将前一个节点的链域设为null
    size--;
    return current.data;//返回删除节点的数据域
  }

}
/**
* 删除头节点
* @return
*/
public T deleteHeader(){
  return deleteNode(0);
}
/**
* 删除尾节点
* @return
*/
public T deleteTailer(){
return deleteNode(size-1);
}

//清空节点
public void clear(){
  header = null;
  tailer = null;
  size = 0;
}

/**
* toString();
*/
public String toString(){
  if(size == 0)
    return "[]";
  Node current = header;
  StringBuilder sb = new StringBuilder();
  sb.append("[");
  while(current.next != null) {
    sb.append(current.data).append(" ");
    current = current.next;
  }
  sb.append(current.data).append("]");
  return sb.toString();
}

public static void main(String[] args) {
  MyLinkedList<String> link = new MyLinkedList<>();
  link.add("header");
  link.add("11");
  link.add("22");
  link.add("33");
  link.addAtheader("newheader");
  link.insert(2, "1.5");;

  System.out.println(link.getIndex("11"));
  System.out.println(link.getIndex("88"));
  System.out.println(link.get(0));
  System.out.println(link.getSize());
  System.out.println(link.deleteHeader());
  System.out.println(link.deleteTailer());
  System.out.println(link.deleteNode(1));
  System.out.println(link);
  link.clear();
  System.out.println(link);

  }

}

时间: 2024-10-12 20:02:39

java-------单链表的相关文章

java 单链表的实现

package liaobiao;//链表测试public class Node { private int value; private Node next; //存放下一个节点的指针 //构造方法,进行传参 public Node(int value){ this.value = value; } public Node(){ } //像链表的尾部加入元素,需要先找到最后一个节点 public void addNode(Node n ){ //需要先找到最后一个节点 Node node =t

Java单链表、双端链表、有序链表实现

Java单链表.双端链表.有序链表实现 原创 2014年03月31日 23:45:35 标签: Java / 单链表 / 双端链表 / 有序链表 65040 单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见http://blog.csdn.net/a19881029/article/details/22579759 find:查找包含指定关键字的链接点

java单链表代码实现

用惯了C++,java写起来果然不太爽...不废话了,上代码... package javaInnerclassDemo; class Link{ class Node{ private String name; private Node next; public Node(String name){ this.name=name; } public void setname(String name){ this .name = name; } public String getname(){

java单链表常用操作

总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K个节点] [查找链表中间节点] [判断链表是否有环] [从尾到头打印单链表-递归] [从尾到头打印单链表-栈] [由小到大合并有序单链表-循环] [由小到大合并有序单链表-递归] 通常在java中这样定义单链表结构 <span style="font-family:Microsoft YaHe

JAVA单链表的实现-不带头结点且没有尾指针

本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有一个指针始终指向链表中的第一个元素,并没有定义尾指针.因此,每次向链表中插入新结点时需要遍历链表一次. 更详细的解释参考<数据结构与算法分析 JAVA语言描述第二版>Frank M. Carrano 著 ListInterface接口的定义如下: public interface ListInte

JAVA单链表的实现-不带头结点但带有尾指针

1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾指针直接找到链表的最后一个元素,从而不需要遍历链表就可以完成插入操作. 2,具体实现链表的类名为LList2.java,它首先实现了线性表的接口ListInterface,该接口的定义见:http://www.cnblogs.com/hapjin/p/4549492.html LList2.java

java单链表

单链表 一.单链表的概念 链表是最基本的数据结构,其存储的你原理图如下图所示 上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一个节点,就这样一节一节往下面记录,直到最后一个节点,其中的next指向null. 链表有很多种,比如单链表,双链表等等.我们就对单链表进行学习,其他的懂了原理其实是一样的. 二.用java实现单链表 语言只是一种工具,数据结构真正体会的是那种

Java 单链表的倒置

在面试,笔试的过程中经常会遇到面试官问这种问题,实现单链表的倒置方法.现在对单链表的倒置犯法做个记录,方便自己以后查看. 单链表的定义: 1 public class Node { 2 3 int v; 4 Node next; 5 public Node(){ 6 } 7 public Node(int v){ 8 this.v = v; 9 } 10 11 public int getV() { 12 return v; 13 } 14 public void setV(int v) { 1

java单链表的实现自己动手写一个单链表

单链表:单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据.自己手动写一个单链表:首先,定义一个节点类: package com.wei; public class Link { public int data;// 存放数据 public Link next;// 存放下一个节点 public Link(

Java单链表的实现

将结点Node进行封装,假设Node的操作有增加,删除,查找,打印几个操作.将Node实现为链表Link的内部类,简化代码. package Chapter5; import java.security.cert.LDAPCertStoreParameters; class Link{ class Node{ private String data; private Node next; public Node(String data){ this.data = data; this.next