`
lueye
  • 浏览: 13636 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

线性表的单链表实现

阅读更多

      数据结构和算法是程序的灵魂,基本的数据结构分为:线性结构、树、图。线性结构又分为顺序实现的线性结构和链式实现的线性结构。链式线性结构是非随机存取结构,其get()、set()的时间复杂度是O(N);若已知要插入或删除的节点位置的话,其insert()、remove()的时间复杂度为O(1)。否则需要进行遍历操作,这时insert()、remove()的时间复杂度为O(N)。

       首次写博客,望各位大牛拍砖来助学习。 

       以下 是单链表的实现代码:

线性表的抽象数据类型:

package dataStructtion.linear;
/**
 * 线性表的抽象数据类型
 * @author xiucai
 * @param <T>
 */
public interface LList<T> {
	/**
	 * 判断是否为空
	 * @return
	 */
	public boolean isEmpty();
	/**
	 * 返回线性表长度
	 * @return
	 */
	public int length();
	/**
	 * 返回下标为i的元素(i>=0)
	 * @param i
	 * @return
	 */
	public T get(int i);
	/**
	 * 设置下标为i的元素值为t
	 * @param i
	 * @param t
	 */
	public void set(int i,T t);
	/**
	 * 在下标为i的位置插入元素t
	 * @param i
	 * @param t
	 */
	public void insert(int i,T t);
	/**
	 * 在线性表末尾追加元素t
	 * @param t
	 */
	public void append(T t);
	/**
	 * 移除下标为i的元素
	 * @param i
	 * @return
	 */
	public T remove(int i);
	/**
	 * 移除线性表所有元素
	 */
	public void removeAll();
	/**
	 * 查找,返回首次出现的关键字为key的元素
	 * @param t
	 * @return
	 */
	public T search(T t);
	/**
	 * 判断线性表是否包含元素t
	 * @param t
	 * @return
	 */
	public boolean contain(T t);
}


单节点的数据结构:

package dataStructtion.linear;
/**
 * 链表的单个节点 
 * @author xiucai
 * @param <T>
 */
public class Node<T> {
	public Object data;//存放数据
	public Node<T> next;//后继
	//初始化节点
	public Node(Object data,Node<T> next){
		this.data=data;
		this.next=next;
	}
	public Node(){
		this(null,null);
	}
	//重写toString方法,用于输出
	public String toString(){
		return this.data.toString();
	}
	//重写equals方法,用于比较
	public boolean equals(Object data){
		if (this.data==data)
			return true;
		if(data instanceof Node){
			Node<T> node=(Node<T>)data;
			if(this.data==node.data&&this.next==node.next)
				return true;
		}
		return false;
	}
	
}



单链表的实现类:


package dataStructtion.linear;
/**
 * 线性表的单链表表示与实现
 * @author xiucai
 * @param <T>
 */
public class SingleLinkedList<T> implements LList<T> {
	private Node<T> head;//头结点
	private int len;//链表长度
	//初始化单链表
	public SingleLinkedList(){
		head=new Node<T>();
		len=0;
	}
	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return len==0;
	}
	//获取单链表的长度
	@Override
	public int length() {
		// TODO Auto-generated method stub
		return len;
	}
	//获取第i下标的元素
	@Override
	public T get(int i) {
		// TODO Auto-generated method stub
		if(i<0||i>this.len)
			throw new IndexOutOfBoundsException(i+"下标越界");
		Node<T> node=this.head.next;
		for(int j=0;node!=null&&j<i;j++){
			node=node.next;
		}
		return (T)node.data;
	}
	//设置第i个元素为t
	@Override
	public void set(int i, T t) {
		// TODO Auto-generated method stub
		if(i<0||i>this.len)
			throw new IndexOutOfBoundsException(i+"下标越界");
		if(t==null)
			return ;
		Node<T> node=this.head;
		for(int j=0;node.next!=null&&j<i;j++){
			node=node.next;
		}
		node.data=t;
	}
	//在第i个位置插入元素t
	@Override
	public void insert(int i, T t) {
		// TODO Auto-generated method stub
		if(i<0||i>this.len)
			throw new IndexOutOfBoundsException(i+"下标越界");
		if(t==null) return ;
		Node<T> node=this.head;
		for(int j=0;node.next!=null&&j<i-1;j++){
			node=node.next;
		}
		Node<T> p=new Node<T>(t,node.next);
		node.next=p;
		len++;
	}
	//在单链表末尾追加元素t
	@Override
	public void append(T t) {
		// TODO Auto-generated method stub
		if(t==null)
			return ;
		Node<T> node=this.head;
		for(int i=0;node.next!=null&&i<this.len;i++){
			node=node.next;
		}
		node.next=new Node<T>(t,null);
		len++;
	}
	//移除第i下标的元素
	@Override
	public T remove(int i) {
		// TODO Auto-generated method stub
		if(i<0||i>this.len)
			throw new IndexOutOfBoundsException(i+"下标越界");
		Node<T> node=this.head;
		for(int j=0;node.next!=null&&j<=i-1;j++){
			node=node.next;
		}
		T t=(T)node.next.data;
		node.next=node.next.next;
		len--;
		return t;
	}
	//清空单链表
	@Override
	public void removeAll() {
		// TODO Auto-generated method stub
		this.head.next=null;
		this.len=0;
	}
	//寻找值为t的元素
	@Override
	public T search(T t) {
		// TODO Auto-generated method stub
		if(t==null) 
			return null;
		Node<T> node=this.head;
		for(int i=0;node.next!=null&&i<this.len;i++){
			if(node.next.data.equals(t))
				return (T)node.next.data;
			node=node.next;
		}
		return null;
	}
	//判断单链表是否包含t元素
	@Override
	public boolean contain(T t) {
		// TODO Auto-generated method stub
		return this.search(t)!=null;
	}
	//重写toString,用于输出
	@Override
	public String toString(){
		Node<T> node=this.head;
		String string="[";
		for(int i=0;node.next!=null&&i<this.len;i++){
			string+=node.next.data+" ";
			node=node.next;
		}
		return string+"]";
 	}
}




此类为测试类:



package dataStructtion.linear;
/**
 * 此类用于测试
 * @author xiucai
 */
public class SingleLinkTest {
	public static void main(String[] args) {
		SingleLinkedList<String> s=new SingleLinkedList<String>();
		s.insert(0, "aaa");
		s.append("bbb");
		System.out.println(s);
		System.out.println(s.length());
		System.out.println(s.search("aaa"));
		System.out.println(s.contain("aaa"));
		for(int i=0;i<s.length();i++){
			System.out.println(s.get(i));
		}
		System.out.println(s.remove(0));
		System.out.println(s);
		
		s.removeAll();
		System.out.println(s.length());
		System.out.println(s);
	}
}

 

分享到:
评论

相关推荐

    C++ 数据结构中单链表实现线性表

    链表实现线性表的基本功能,继而更进一步地去活学活用的用好这个基本数据结构,最后更好的编程续写出更完美的程序片段

    数据机构 线性表 单链表 栈 汉诺塔 迷宫求解 等的演示

    单链表是线性表的一种链式实现,每个元素(节点)包含数据部分和一个指向下一个节点的指针。单链表的插入和删除操作通常比数组快,因为只需要改变相邻节点的指针即可。不过,查找元素需要从头节点开始遍历,效率较低...

    数据结构课件 线性表 单链表 栈和队列 串 数组和广义表 树和二叉树 C语言版

    本课件聚焦于数据结构的基础部分,特别是线性表、单链表、栈和队列、串、数组和广义表,以及树和二叉树,所有这些概念都是用C语言实现的。 1. **线性表**:线性表是最基本的数据结构,它是由n(n≥0)个相同类型...

    线性表,单链表,栈 java实现

    线性表、单链表和栈是数据结构中基础且重要的概念,它们在计算机科学和软件工程中扮演着核心角色。下面将详细解释这些概念及其Java实现。 **线性表** 是一种基本的数据结构,它是由n(n&gt;=0)个相同类型元素构成的...

    线性表(单链表 C++语言编写的)

    本文将详细介绍线性表的概念、单链表的实现、C++语言的应用及相关知识点。 一、线性表的概念 线性表是数据结构中的一种,指的是元素之间存在着一对一的关系,且每个元素都只有一个直接前驱和一个直接后继。线性表...

    数据结构实战--线性表的单链表实现

    本实战项目聚焦于数据结构中的线性表,特别是通过单链表进行实现。线性表是一种基本的数据结构,由相同类型元素的有序序列组成,而单链表是其一种常见表示方式。 单链表是一种动态数据结构,每个元素(称为节点)...

    数据结构C语言版-线性表的单链表存储结构表示和实现.doc

    "数据结构C语言版-线性表的单链表存储结构表示和实现" 本文档介绍了线性表的单链表存储结构表示和实现,使用C语言编写,提供了多种操作函数,包括初始化、销毁、清空、判断空表、获取元素、获取元素位序等。 数据...

    将带头结点的单链表实现线性表的功能

    将带头结点的单链表实现线性表的功能

    数据结构C语言版-线性表的单链表存储结构表示和实现优质资料.doc

    数据结构C语言版-线性表的单链表存储结构表示和实现优质资料.doc 知识点摘要: 1. 数据结构的基本概念:数据结构是计算机科学中的一种基本概念,指的是数据的组织和存储方式。 2. 线性表的概念:线性表是一种基本...

    利用带头结点的单链表实现两个集合的并、交、差运算.docx

    利用带头结点的单链表实现两个集合的并、交、差运算 本文档的主要内容是使用带头结点的单链表实现两个集合的并、交、差运算。该文档共分为八个部分,分别是题目重述、题目功能描述、概要设计图、程序源代码及注释、...

    线性表-单链表

    单链表的类定义和类实现,常见操作,插入、删除。

    数据结构---线性表之单链表(C语言)

    除了基本的创建、插入和删除,还可以实现单链表的反转、查找、排序等高级操作。例如,反转单链表可以使用迭代或递归方法,查找特定值的节点则需要遍历链表。 五、注意事项 在处理链表时,需要注意内存管理。创建新...

    线性表的C语言实现

    文件"sqlist"可能包含了线性表的C语言实现源代码,通常会包含头文件定义、结构体定义、函数声明以及对应的函数实现,如初始化线性表、插入元素、删除元素、打印线性表等函数。通过阅读和学习此类代码,可以加深对...

    线性表的实现实验报告

    2. **理解并实现链式存储结构下的线性表**:设计算法实现求解动态单链表的长度及特定元素x的位置。 #### 实验内容 ##### 算法一:顺序表中插入元素 该部分的目标是在一个已经按递增顺序排列的线性表中插入一个...

    线性表的实现全部代码

    本文详细介绍了线性表在C语言中的实现方法,包括单链表的存储结构、初始化、建表(头插法)、遍历、删除、查找等功能的具体实现。这些基本操作是理解和运用线性表数据结构的基础。通过学习本文,读者可以更好地掌握...

    数据结构(Java版)-线性表的实现与应用完整版.doc

    本文将通过两个部分来介绍线性表的实现和应用:顺序表的实现与应用和单链表的实现与应用。 顺序表的实现与应用 顺序表是一种基本的线性表结构,它的特点是将数据元素存储在连续的存储单元中。通过实现顺序表的基本...

    实验1-2 线性表-单链表.doc

    实验的具体任务是使用单链表实现一个病患信息管理系统。该系统需要支持以下功能: 1. **病患信息表的建立** - **实现代码**:通过`CreateList()`函数初始化空的单链表。 - **操作流程**:调用`CreateList()`函数...

    线性表的实现,怎么样实现线性表

    在计算机科学中,线性表的实现通常涉及数组和链表两种方式,每种方式都有其特点和适用场景。 一、数组实现线性表 1. 定义:数组是最基本的线性数据结构,它可以看作是在内存中连续存储的一系列相同类型元素的集合。...

Global site tag (gtag.js) - Google Analytics