关闭

java 数据结构之单链表

319人阅读 评论(0) 收藏 举报

例子

package com.hh.singlylinkedlist;

/**
* 单链表的结点类
* @author user
*
* @param <T>
*/
public class Node<T> {
public T data; //数据域,保存数据元素
public Node<T> next; //地址域,引用后继结点

public Node(){
this(null, null);
}

public Node(T data, Node<T> next){
this.data = data;
this.next = next;
}

}


package com.hh.singlylinkedlist;

/**
* 线性表接口
* @author user
*
*/
public interface LList<T> {
boolean isEmpty(); //判断线性表是否为空
int length(); //返回线性表的长度
T get(int i); //返回第i(i>=0)个元素
void set(int i, T x); //设置第i个元素值为x
void insert(int i, T x);//插入x作为第i个元素
void append(T x); //在线性表最后插入x元素
T remove(int i); //删除第i个元素并返回被删除对象
void removeAll();//删除线性表所有元素
T search(T key); //查找,返回首次出现的关键字为key元素
}

package com.hh.singlylinkedlist;

/**
* 带头结点单链表类
* @author user
*
* @param <T>
*/
public class SinglyLinkedList<T> implements LList<T>{
protected Node<T> head; //头指针,指向单链表的

//默认构造方法,构造空的单链表,创建头结点,data和next值均为null
public SinglyLinkedList() {
this.head = new Node<T>();
}

//指定数组中的多个对象构造单链表,采用尾插入构造单链表
public SinglyLinkedList(T[] element){
//创建空单链表,只有头结点
this();
if(element == null){
return;
}
//rear指向单链表最后一个结点(这里指的是头结点)
Node<T> rear = this.head;
for(int i=0; i<element.length; i++){
//尾插入,创建结点链入rear结点之后
rear.next = new Node<T>(element[i],null);
//rear指向新的链尾结点
rear = rear.next;
}
}

//判断单链表是否为空
@Override
public boolean isEmpty() {
return this.head.next == null;
}

@Override
public int length() {
int i=0;
Node<T> p = this.head.next; //p从单链表第一个结点开始
while(p != null){ //判断单链表是否结束了
i++;
p = p.next; //p到达后继结点
}
return 0;
}

//返回单链表所有元素的描述字符串,形式为"(,)",覆盖Object类的toString()方法,O(n)
@Override
public String toString() {
String str = "(";
Node<T> p = this.head.next;
while(p != null){
str += p.data.toString();
p = p.next;
if(p != null){
str += ",";
}

}
return str + ")";
}

//返回第i(i>=0)个元素,若i指定序号无效,则返回null
@Override
public T get(int i) {
if(i >=0){
Node<T> p = this.head;
for(int j =0; p != null && j<i; j++){
p = p.next;
}
if(p != null){
return p.data;
}
}
return null;
}

//设置第i(i>=0)个元素值为x,若i指定序号无效,则抛出序号越界异常
@Override
public void set(int i, T x) {
if(x == null){
return;
}
if(i >=0){
Node<T> p = this.head.next;
for(int j=0; p != null && j<i; j++){
p = p.next;
}
if(p != null){
p.data = x;
}
}else{
throw new IndexOutOfBoundsException(i+"");
}
}

//将x对象插入在序号为i结点前
@Override
public void insert(int i, T x) {
if(x == null){
return;
}
Node<T> p = this.head; //p指向头结点
for(int j=0; p.next != null && j<i; j++){
p = p.next;
}
p.next = new Node<T>(x,p.next);
}

@Override
public void append(T x) {
insert(Integer.MAX_VALUE, x);
}

@Override
public T remove(int i) {
if(i>=0){
Node<T> p = this.head;
for(int j=0; p.next != null && j<i; j++){
p = p.next;
}
if(p.next != null){
T old = p.next.data;
p.next = p.next.next;
return old;
}
}
return null;
}

@Override
public void removeAll() {
this.head.next = null;
}

//查找某个元素是否存在
@Override
public T search(T key) {
if(key == null){
return null;
}
Node<T> p = this.head.next;
while(p != null){
if(p.data.equals(key)){
return p.data;
}
p = p.next;
}
return null;
}

}

package com.hh.singlylinkedlist;

public class TestMain {

public static void main(String[] args) {
String[] strArr = {"1","2","3","4","5","6","7","8","9","10",
"11","12","13","14","15","16"};
SinglyLinkedList<String> bean = new SinglyLinkedList<String>(strArr);
String str = bean.toString();
System.out.println("原数组内容:"+str);

int i = 5;
str = bean.get(i);
System.out.println("获取第"+i+"元素值:"+str);

bean.insert(i, "55");
System.out.println("在第"+i+"位置插入数据后的数组:"+bean.toString());

str = bean.remove(i);
System.out.println("删除的元素:"+ str );
System.out.println("在第"+i+"位置删除数据后的数组:"+bean.toString());

str = bean.search("8");
System.out.println("查找第8个元素的值为:"+str);
}
}

源码下载



0
0
查看评论

数据结构之单链表(C++实现)

很早前就想用C++来实现那些常用的数据结构。 今天就算是个开端把。还是那句话,看的再多不如自己动手写一遍。 按照自己的思路写。首先你得熟悉那种结构的特点,然后才能谈实现。  链表是一种很常用的数据结构。支持在任意地方对数据进行增删改查。 但是不支持随机访问。所以复杂度就有些高了。写...
  • complety
  • complety
  • 2012-04-08 15:25
  • 7501

数据结构的Java实现——单链表

单链表的Java实现
  • baoyiming1991
  • baoyiming1991
  • 2011-03-21 21:23
  • 5325

数据结构-java与c实现带头结点的单链表

题目:设顺序表va中的数据元素递增有序,试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。
  • qq_27941641
  • qq_27941641
  • 2016-04-05 18:59
  • 764

Java数据结构-线性表之单链表应用-单链表的逆置

单链表的逆置,就是将现有单链表中的元素的顺序倒置过来。之前提过单链表的整表创建,那里曾说过两种方法:头插法和尾插法; 在我的Java版本的LinkedList中,添加方法使用的是尾插法。 而单链表的逆置正好是利用头插法来进行。 下面看看演示: 下面是我的Java代码实现,建立在之前的代码...
  • yannanying
  • yannanying
  • 2015-07-19 23:19
  • 1233

【数据结构与算法】——链表篇

链表属于线性结构之一,主要功能是提供可动态扩展的线性结构,可使用不连续的的内存空间,为程序的动态特性提供支持。逻辑结构如下(图片引用自CSDN博客)            一般的定义如下 /*...
  • theprinceofelf
  • theprinceofelf
  • 2012-01-16 15:49
  • 3667

数据结构之链表学习心得

顺序表从节点之间的链接方式分我连续空间顺序表和链式顺序表,前者的实现就是在普通数组上做了封装,后者实现就是前一个节点保存后一个节点的地址。本文讨论的就是后者,链式顺序表的一个最明显的特征,就是在增减,插入,排序,遍历等操作中有更好的效率,这些操作的有一个共同的核心思想,就是对链表节点进行重新排序。添...
  • liubo2011
  • liubo2011
  • 2016-05-01 10:02
  • 633

数据结构单链表的建立的使用

建立单链表的意义: 储存数据 一般就是用的数组,灵活性也是很好的,但是数组的大小必须在开始的时候预先定义好,在未知的情况下就很容易损耗空间; 单链表:
  • woshinannan741
  • woshinannan741
  • 2015-10-03 18:02
  • 2459

Java数据结构-单链表

本文将数据结构知识中重要知识点:数据元素,结点,数据类型,抽象数据类型,抽象数据类型的实现、以及对新定义的数据结构的应用等知识通过下述java代码的形式串联起来,以从宏观上对数据结构有一个透彻的理解和认识。        我们要使用单链表这个数据结构来解...
  • wk_learn
  • wk_learn
  • 2014-06-13 08:43
  • 3379

算法和数据结构单链表的逆转

public void reverse(SinglyListT> list) { NodeT> p = list.head.next, succ = null, front = null; while (p != null) { succ = p.next...
  • RobertShell1998
  • RobertShell1998
  • 2017-04-09 14:47
  • 291

数据结构:单链表(逆序)

1 .单链表的逆序操作是链表中的一个重要操作,也是面试中不可缺少的一个环节,几乎许多涉及到链表的面试题中都会提到如何将一个链表进行逆序的操作考点;下面采用“迭代循环”的方式来实现将一个链表进行逆序,如链表中原来的各节点值分别为:A B C D E 逆序后打印为:E ...
  • lixiaogang_theanswer
  • lixiaogang_theanswer
  • 2017-04-23 17:43
  • 231
    个人资料
    • 访问:63280次
    • 积分:1054
    • 等级:
    • 排名:千里之外
    • 原创:43篇
    • 转载:7篇
    • 译文:0篇
    • 评论:15条
    最新评论