单链表类

2024-03-31 11:32
文章标签 单链 表类

本文主要是介绍单链表类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

           1.单链表类之java实现(结点类Node见单链表分析)

package linearList;public class SinglyLinkedList<E> implements LList<E>{protected Node<E> head;//头指针,指向单链表第一个结点/** 构造空单链表*/public SinglyLinkedList(){this.head = null;}/** 构造指定头指针的单链表*/public SinglyLinkedList(Node<E> head){this.head = head;}/** 判断单链表是否为空*/public boolean isEmpty(){return this.head == null;}/** 返回单链表长度,遍历算法*/public int length(){int count = 0;Node<E> p = this.head;while(p!=null){p = p.next;count++;}return count;}/** 返回序号为index的对象*/public E get(int index){if(this.head!=null&&index>=0){Node<E> p = this.head;int i = 0;while(p!=null&&i<index){i++;p = p.next;}if(p!=null){return (E)p.data;}}return null;}/** 设置序号为index的对象的值为element,返回原对象*/public E set(int index,E element){if(this.head!=null&&index>=0&&element!=null){Node<E> p = this.head;int i = 0;while(p!=null&&i<index){i++;p = p.next;}if(p!=null){E old = (E)p.data;p.data = element;return old;}}return null;}/** 插入element对象,插入位置序号为index*/public boolean add(int index,E element){if(element==null){return false;}/** 头插入*/if(this.head==null||index<=0){Node<E> q = new Node<E>(element);//给将要插入的element建立结点,方便操作q.next = this.head;this.head = q;}else{//单链表不为空,并且index>=1Node<E> p = this.head;int i = 0;while(p.next!=null&&i<index-1){//寻找插入位置i++;p = p.next;}Node<E> q = new Node<E>(element);q.next = p.next;p.next = q;}return true;}public boolean add(E element){return add(this.length(),element);}/** 移除序号为index的对象,返回被移除的对象*/public E remove(int index){E old = null;if(this.head!=null&&index>=0){if(index==0){//头删除old = (E)this.head.data;this.head = this.head.next;}else{//中间/尾删除int i = 0;Node<E> p = this.head;while(p.next!=null&&i<(index-1)){i++;p = p.next;}if(p.next!=null){old = (E)p.next.data;p.next = p.next.next;}}}return old;}/** 清空单链表*/public void clear(){this.head = null;}/** 返回所有元素对应的字符串*/public String toString(){String str = "(";Node<E> p = this.head;while(p!=null){str += p.data.toString();p = p.next;if(p!=null){str += ",";}}return str + ")";}
}
          2.单链表操作的效率分析

                        单链表是一种顺序存储结构,不是随机存储结构。访问第i个结点,必需从head开始,沿着链的方向逐个查找,进行i次的p=p.next操作,平均进行n/2次,因此,get和set方法的时间复杂度都是O(n)

                isEmpty()方法的时间复杂度是O(1),length()方法要遍历整个单链表,时间复杂度是O(n)。

               在指定的结点之后插入新结点的操作十分方便,时间复杂度是O(1);如果要在指定结点的前面插入新结点,就必须首先找到指定结点的前驱结点,然后把新结点插在该结点之后,这个过程需要遍历部分单链表,花费时间视插入的位置而定,最后的情况就是新结点插在单链表的最后,此时时间复杂度为O(n);同理,删除操作也如此。

            从上面我们可以看出有时候单链表的效率不是太高,这就需要我们去改进,这也是为什么出现了很多的链表形式的原因,之后我会一一介绍。

这篇关于单链表类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864228

相关文章

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

Go语言构建单链表

package mainimport "fmt"type ListNode struct {Val intNext *ListNode}func main() {list := []int{2,4,3}head := &ListNode{Val:list[0]}tail := head //需要头尾两个指针for i:=1;i<len(list);i++ {//方法一 数组直接构建链表tai

[数据结构]线性表之单链表的类模板实现

类的具体实现如下: /#include"LinearList.h"#include <iostream>#include <cstdlib>using namespace std;template<class T>struct LinkNode //链表节点类{T data;LinkNode<T>* link;LinkNode(LinkNode<T>* ptr=NULL):

逆序和顺序创建单链表

单链表是一种顺序的存储方式,数据结构学的不好,考研又是必考内容,只好从头开始学习,相信不断地积累会有更好的爆发! 首先单链表的创建,单链表是建立在结构体的基础上,要创建单链表首先要建立起一个储存数据的结构体: struct node{int elem;node *next;};elem是数据域,用来存放你要输入的数据,next是指向下个存放数据节点的指针同为node 类型; 下面是

单链表核心操作代码

头插法建立单链表 代码: void createListByHead(LinkList &L,int n){LNode *s;//移动指针s int x;//要插入的元素 L = (LinkList)malloc(sizeof(LNode));//创建头结点 L->next=NULL;//初始化头结点 for(int i=0;i<n;i++){scanf("&d",&x);//输入要插入的值

浅谈单链表与双链表的区别

数组的优点 随机访问性强(通过下标进行快速定位) 查找速度快 数组的缺点 插入和删除效率低(插入和删除需要移动数据) 可能浪费内存(因为是连续的,所以每次申请数组之前必须规定数组的大小,如果大小不合理,则可能会浪费内存) 内存空间要求高,必须有足够的连续内存空间。 数组大小固定,不能动态拓展 链表的优点 插入删除速度快(因为有next指针指向其下一个节点,通过改变指针的指向可以方便的增加删除元素)

数据结构——单链表查询、逆序、排序

1、思维导图 2、查、改、删算法 //快慢排序法找中间值int mid_link(Link_t *plink){Link_Node_t *pfast = plink->phead;Link_Node_t *pslow = pfast;int m = 0;while(pfast != NULL){pfast = pfast->pnext;++m;if(m % 2 == 0){pslow

数据结构--单链表C/C++

最近在学习数据结构,其中有介绍单链表跟单循环链表的,现在复习一下。首先要定义一下数据结构(节点),如下: typedef int DataType; //方便后面修改数据类型,有点像C++/JAVA中的泛型typedef struct Node {DataType data;struct Node *next;}Node; 单链表:  接下来是定义一个获取链表某个位置节点的函数,如

入门数据结构JAVA DS——如何实现简易的单链表(用JAVA实现)

前言 链表(Linked List)是一种线性数据结构,它由一系列节点组成,每个节点包含两个部分:存储数据的部分和指向下一个节点的指针(或引用)。链表的结构使得它能够动态地增长和收缩,适合在不固定长度的序列中进行插入和删除操作。 链表的基本概念: 节点(Node):链表的基本单位,每个节点包含两个部分: 数据域(Data):存储节点的具体数据。指针域(Pointer/Next):存储指

数据结构——单链表相关操作

zhuzhu1、结构框图: 2、增删改查: 定义链表节点和对象类型 /*************************************************************************> File Name: link.h> Author: yas> Mail: rage_yas@hotmail.com> Created Time: Tue 03 Sep