数据结构和算法是程序的灵魂,基本的数据结构分为:线性结构、树、图。线性结构又分为顺序实现的线性结构和链式实现的线性结构。链式线性结构是非随机存取结构,其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语言实现的。 1. **线性表**:线性表是最基本的数据结构,它是由n(n≥0)个相同类型...
线性表、单链表和栈是数据结构中基础且重要的概念,它们在计算机科学和软件工程中扮演着核心角色。下面将详细解释这些概念及其Java实现。 **线性表** 是一种基本的数据结构,它是由n(n>=0)个相同类型元素构成的...
本文将详细介绍线性表的概念、单链表的实现、C++语言的应用及相关知识点。 一、线性表的概念 线性表是数据结构中的一种,指的是元素之间存在着一对一的关系,且每个元素都只有一个直接前驱和一个直接后继。线性表...
本实战项目聚焦于数据结构中的线性表,特别是通过单链表进行实现。线性表是一种基本的数据结构,由相同类型元素的有序序列组成,而单链表是其一种常见表示方式。 单链表是一种动态数据结构,每个元素(称为节点)...
"数据结构C语言版-线性表的单链表存储结构表示和实现" 本文档介绍了线性表的单链表存储结构表示和实现,使用C语言编写,提供了多种操作函数,包括初始化、销毁、清空、判断空表、获取元素、获取元素位序等。 数据...
将带头结点的单链表实现线性表的功能
数据结构C语言版-线性表的单链表存储结构表示和实现优质资料.doc 知识点摘要: 1. 数据结构的基本概念:数据结构是计算机科学中的一种基本概念,指的是数据的组织和存储方式。 2. 线性表的概念:线性表是一种基本...
利用带头结点的单链表实现两个集合的并、交、差运算 本文档的主要内容是使用带头结点的单链表实现两个集合的并、交、差运算。该文档共分为八个部分,分别是题目重述、题目功能描述、概要设计图、程序源代码及注释、...
单链表的类定义和类实现,常见操作,插入、删除。
除了基本的创建、插入和删除,还可以实现单链表的反转、查找、排序等高级操作。例如,反转单链表可以使用迭代或递归方法,查找特定值的节点则需要遍历链表。 五、注意事项 在处理链表时,需要注意内存管理。创建新...
文件"sqlist"可能包含了线性表的C语言实现源代码,通常会包含头文件定义、结构体定义、函数声明以及对应的函数实现,如初始化线性表、插入元素、删除元素、打印线性表等函数。通过阅读和学习此类代码,可以加深对...
2. **理解并实现链式存储结构下的线性表**:设计算法实现求解动态单链表的长度及特定元素x的位置。 #### 实验内容 ##### 算法一:顺序表中插入元素 该部分的目标是在一个已经按递增顺序排列的线性表中插入一个...
本文详细介绍了线性表在C语言中的实现方法,包括单链表的存储结构、初始化、建表(头插法)、遍历、删除、查找等功能的具体实现。这些基本操作是理解和运用线性表数据结构的基础。通过学习本文,读者可以更好地掌握...
本文将通过两个部分来介绍线性表的实现和应用:顺序表的实现与应用和单链表的实现与应用。 顺序表的实现与应用 顺序表是一种基本的线性表结构,它的特点是将数据元素存储在连续的存储单元中。通过实现顺序表的基本...
实验的具体任务是使用单链表实现一个病患信息管理系统。该系统需要支持以下功能: 1. **病患信息表的建立** - **实现代码**:通过`CreateList()`函数初始化空的单链表。 - **操作流程**:调用`CreateList()`函数...
在计算机科学中,线性表的实现通常涉及数组和链表两种方式,每种方式都有其特点和适用场景。 一、数组实现线性表 1. 定义:数组是最基本的线性数据结构,它可以看作是在内存中连续存储的一系列相同类型元素的集合。...