`
lueye
  • 浏览: 13716 次
  • 性别: 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