【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。

这篇具有很好参考价值的文章主要介绍了【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

                                                  【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

大家好,今天我们来学习数据结构中的顺序表与链表!源码在最后附上

首先我们先来认识一下顺序表

                                     【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

**如上图所示:很多人会以为数组就是顺序表,顺序表就是数组,这种理解时错误的。

数组:

数组是相同数据类型的元素按一定顺序排列的的集合。数组中的元素存储在一个连续性的内存块中,并通过索引来访问。

简单的说,数组是在物理空间中连续存储的相同数据类型的元素的集合

而顺序表:

顺序表,全名顺序存储结构,是线性表的一种。(线性表(linear list)是数据结构的一种,一个线性表是 n 具有相同特性的数据元素的有限序列。线性表在逻辑上是线性结构,也就说是连续的一条直线,但是在物理结构上并不一定是连续的。常见的线性表:顺序表、链表、栈、队列、字符串等。

顺序表不仅要求数据在逻辑上是连续的一条直线,还要求用一段物理地址连续的存储单元以存储表中数据元素,一般情况下采用数组存储。

总结:

顺序表是在计算机内存中以数组的形式保存的线性表,只能从头开始连续存储。
此处将「数组」理解为物理结构,「顺序表」理解为逻辑结构比较合理
我们可以用数组实现顺序表,但我们同样可以用数组实现二叉树、队列等结构,因此不能直接认为顺序表就是数组
在顺序表中我们可以定义表中元素个数、表空间大小等变量,在数组中是没有的

    【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法                 

首先我们来学习一下顺序表的静态存储

                                         【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

而顺序表的静态存储又存在明显的缺陷和不足

不知道需要给确定的多少个空间,N给小了不够用,N给大了会浪费。

那么如何解决这个问题呢?

在这里我们使用malloc来动态开辟空间,再使用realloc来进行空间的管理

顺序表的动态存储:

                                   【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

在这里我们要注意realloc扩容存在异地扩容原地扩容俩种情况;

注意地址,当你realloc的空间没有那么大时,这里就是原地扩容

                       【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法  

注意地址,当你realloc的空间很大的时候,就会异地扩容

          【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

这里先让我们简单的来实现顺序表的几个功能:(完整功能最后附上源码)

实现顺序表的头插,即往前边插进去数据:

 【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

实现顺序表中间插入数据

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

实现顺序表的删除

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

通过以上学习,我们大概了解了顺序表的一些基础知识,那么顺序表是否存在一些缺点呢?

顺序表的缺点

1.尾部插入数据还不错,但是头部和中间插入删除数据,效率低下,需要挪动数据。 

2.满了之后只能扩容,而扩容是有一定的消耗的,扩容一般是存在一定的空间浪费(假如空间100已经满了,扩容到200,只需要插入120个数据,那么就有80个浪费掉了)

3.一次扩的多了,可能浪费掉了;一次扩的少了,有需要频繁去扩容。

                                                      【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

接下来让我们来学习链表 

链表:链表采用链式存储结构,其内存空间不连续

而链表分为单链表双链表,我们先来学习单链表

          【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

                          【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

它是由一个一个结点结合在一起的,而每个节点的地址没有关联,都是随机的,东一个西一个。

注意单链表的最后一个结点指向NULL;

这里我们简单的定义一个单链表:

                                       【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法 

如何去访问链表里的各个结点呢:我们定义一个cur指针指向单链表的头节点,然后通过cur->next来依次访问剩下的结点,如果cur==NULL,说明链表访问完了。

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

接下来我们来实现单链表几个基本的功能:(完整源码结尾附上)

单链表的尾插

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法            【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法               【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

这里需要额外注意:因为phead是plist的临时拷贝,使用要注意二级指针与一级指针的使用,当然不使用二级指针也是可以 ,也有不同的写法,这里这样写是让大家小心注意一下其中的大坑。

单链表的头插:

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

 

单链表的尾删:

                                   【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法     

                                                       【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

需要注意,这里需要区分一个结点多个结点的不同情况。

单链表的头删:

                            【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

这里需要注意:我们的思路是把头节点的指向原本头结点的下一个结点,然后还需要free掉原本的头节点,这里会出现一种很常见的错误

                             【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

先free掉tmp后,就没办法再进行头结点的链接,丢失了地址。

正确的写法:(大家注意区分)

                                【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

关于链表还有一个知识点,就是哨兵位

                           【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

哨兵位就是在头节点的前面给它再加一个结点,让它充当头节点,但它不存储具体的数据,只是更方便进行头插头删等操作,哨兵位的含金量不是很高,有时候方便用来刷OJ题,这里大家简单了解下,有兴趣的朋友自己敲敲代码试一下把。

单链表我们就学到这里,接下来我们学习一下双链表:

这里我们先再来了解下链表有哪些分类:

        【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

我们注意到,单链表和双链表的区别是:单链表一个结点只能指向下一个结点,而双边表一个结点可以指向前一个结点也可以指向后一个结点。

循环链表的特殊之处则是尾结点直接指向了头节点,实现了一个循环。

接下来我们先来比较一下俩种链表:

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

我们主要学习一下带头双向循环链表: 

根据上面单链表的学习,我们简单写几个功能让加强大家对双向链表的理解:

带头双向循环链表的尾插:

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

                         【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

我们可以明显感受到,双向循环链表的数据处理只需要几个简单的指向就可以简单完成;

带头双向循环链表的尾删:

【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

                                 【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。,链表,数据结构,c语言,算法

知识的分享就结束了,接下来附上顺序表与链表的源码:(因为内容较多,所以不是很全,但有具体的框架,大家可以根据自己的需要进行补全)

顺序表:

SeqList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


typedef int SLDataType;

typedef struct SeqList
{
	SLDataType* a;
	int size;      // 有效数据
	int capacity;  // 空间容量
}SL;

void SLInit(SL* psl);
void SLDestroy(SL* psl);

void SLPrint(SL* psl);
void SLCheckCapacity(SL* psl);

// 头尾插入删除
void SLPushBack(SL* psl, SLDataType x);
void SLPushFront(SL* psl, SLDataType x);
void SLPopBack(SL* psl);
void SLPopFront(SL* psl);

// 任意下标位置的插入删除
void SLInsert(SL* psl, int pos, SLDataType x);
void SLErase(SL* psl, int pos);

 SeqList.c

#include"SeqList.h"

void SLInit(SL* psl)
{
	assert(psl);

	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}

void SLDestroy(SL* psl)
{
	assert(psl);

	if (psl->a != NULL)
	{
		free(psl->a);
		psl->a = NULL;
		psl->size = 0;
		psl->capacity = 0;
	}
}

void SLPrint(SL* psl)
{
	assert(psl);

	for (int i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}

void SLCheckCapacity(SL* psl)
{
	assert(psl);

	if (psl->size == psl->capacity)
	{
		int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType)*newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		psl->a = tmp;
		psl->capacity = newCapacity;
	}
}

// 10:37
void SLPushBack(SL* psl, SLDataType x)
{
	assert(psl);

	SLCheckCapacity(psl);

	psl->a[psl->size] = x;
	psl->size++;
}

void SLPushFront(SL* psl, SLDataType x)
{
	assert(psl);

	SLCheckCapacity(psl);

	// 挪动数据
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		--end;
	}

	psl->a[0] = x;
	psl->size++;
}

void SLPopBack(SL* psl)
{
	assert(psl);

	// 空
	// 温柔的检查
	/*if (psl->size == 0)
	{
		return;
	}*/

	// 暴力检查
	assert(psl->size > 0);

	//psl->a[psl->size - 1] = -1;
	psl->size--;
}

// 10:47
void SLPopFront(SL* psl)
{
	assert(psl);

	// 暴力检查
	assert(psl->size > 0);

	int begin = 1;
	while (begin < psl->size)
	{
		psl->a[begin - 1] = psl->a[begin];
		++begin;
	}

	psl->size--;
}

// 注意pos是下标
// size是数据个数,看做下标的话,他是最后一个数据的下一个位置
void SLInsert(SL* psl, int pos, SLDataType x)
{
	assert(psl);
	assert(pos >= 0 && pos <= psl->size);

	SLCheckCapacity(psl);

	// 挪动数据
	int end = psl->size - 1;
	while (end >= pos)
	{
		psl->a[end + 1] = psl->a[end];
		--end;
	}

	psl->a[pos] = x;
	psl->size++;
}

void SLErase(SL* psl, int pos)
{
	assert(psl);
	assert(pos >= 0 && pos < psl->size);

	// 挪动覆盖
	int begin = pos + 1;
	while (begin < psl->size)
	{
		psl->a[begin - 1] = psl->a[begin];
		++begin;
	}

	psl->size--;
}

Test.c:

#include<stdio.h>
#include"SeqList.h"


void TestSL1()
{
	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	SLPushBack(&sl, 6);
	SLPushBack(&sl, 7);
	SLPushBack(&sl, 8);
	SLPushBack(&sl, 9);
	SLPrint(&sl);

	SLPushFront(&sl, 10);
	SLPushFront(&sl, 20);
	SLPushFront(&sl, 30);
	SLPushFront(&sl, 40);
	SLPrint(&sl);

	SLDestroy(&sl);
}

void TestSL2()
{
	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	SLPrint(&sl);

	SLPopBack(&sl);
	SLPrint(&sl);

	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPopBack(&sl);
	SLPrint(&sl);



	SLPushFront(&sl, 10);
	SLPushFront(&sl, 20);
	SLPushFront(&sl, 30);
	SLPushFront(&sl, 40);
	SLPrint(&sl);

	SLDestroy(&sl);
}

void TestSL3()
{
	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPrint(&sl);

	//SLPopFront(&sl);
	//SLPrint(&sl);
}

void TestSL4()
{
	

	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	SLPrint(&sl);

	SLInsert(&sl, 2, 20);
	SLPrint(&sl);

	SLInsert(&sl, 6, 20);
	SLPrint(&sl);

	SLInsert(&sl, 0, 20);
	SLPrint(&sl);

	SLInsert(&sl, 10, 20);
	SLPrint(&sl);

	SLDestroy(&sl);
}

void TestSL5()
{
	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	SLPrint(&sl);

	SLErase(&sl, 3);
	SLPrint(&sl);

	SLErase(&sl, 3);
	SLPrint(&sl);

	//SLErase(&sl, 3);
	//SLPrint(&sl);
}

int main()
{
	TestSL5();
	return 0;
}

单链表: 

 SList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int SLNDataType;

// Single List
typedef struct SListNode
{
	SLNDataType val;
	struct SListNode* next;
}SLNode;

void SLTPrint(SLNode* phead);
void SLTPushBack(SLNode** pphead, SLNDataType x);
void SLTPushFront(SLNode** pphead, SLNDataType x);

void SLTPopBack(SLNode** pphead);
void SLTPopFront(SLNode** pphead);

SLNode* SLTFind(SLNode* phead, SLNDataType x);

// posǰ
SLNode* SLTInsert(SLNode** pphead, SLNode* pos, SLNDataType x);

// ɾposλ
void SLTErase(SLNode** pphead, SLNode* pos);
void SLTDestroy(SLNode** pphead);

SList.c

#include"SList.h"

void SLTPrint(SLNode* phead)
{
	SLNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d->", cur->val);
		cur = cur->next;
	}
	printf("NULL\n");
}

SLNode* CreateNode(SLNDataType x)
{
	SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	newnode->val = x;
	newnode->next = NULL;
	return newnode;
}

void SLTPushBack(SLNode** pphead, SLNDataType x)
{
	SLNode* newnode = CreateNode(x);

	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		// 找尾
		SLNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}

		tail->next = newnode;
	}	
}

void SLTPushFront(SLNode** pphead, SLNDataType x)
{
	SLNode* newnode = CreateNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

void SLTPopBack(SLNode** pphead)
{
	// 温柔的检查
	//if (*pphead == NULL)
	//	return;

	// 空
	assert(*pphead);

	// 1、一个节点
	// 2、一个以上节点
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		// 找尾
		/*SLNode* prev = NULL;
		SLNode* tail = *pphead;
		while (tail->next != NULL)
		{
			prev = tail;
			tail = tail->next;
		}

		free(tail);
		tail = NULL;

		prev->next = NULL;*/

		SLNode* tail = *pphead;
		while (tail->next->next != NULL)
		{
			tail = tail->next;
		}

		free(tail->next);
		tail->next = NULL;
	}
}

void SLTPopFront(SLNode** pphead)
{

	assert(*pphead);

	
	SLNode* tmp = *pphead;
	free(tmp);
	*pphead = (*pphead)->next;
}

Test.c

#include"SList.h"

void TestSLT1()
{
	SLNode* plist = NULL;
	SLTPushBack(&plist, 1);
	SLTPushBack(&plist, 2);
	SLTPushBack(&plist, 3);
	SLTPushBack(&plist, 4);
	SLTPrint(plist);

	SLTPopBack(&plist);
	SLTPrint(plist);

	SLTPopBack(&plist);
	SLTPrint(plist);

	SLTPopBack(&plist);
	SLTPrint(plist);

	SLTPopBack(&plist);
	SLTPrint(plist);

	//SLTPopBack(&plist);
	//SLTPrint(plist);
}

void TestSLT2()
{
	SLNode* plist = NULL;
	SLTPushFront(&plist, 1);
	SLTPushFront(&plist, 2);
	SLTPushFront(&plist, 3);
	SLTPushFront(&plist, 4);
	SLTPrint(plist);

	SLTPopFront(&plist);
	SLTPrint(plist);


	//SLNode* pos = SLTFind(plist, 3);
	//SLTInsert(&plist, pos, 30);
}

//int main()
//{
//	TestSLT2();
//
//	return 0;
//}

struct ListNode
{
	struct ListNode* next;
	int val;
};

struct ListNode* removeElements(struct ListNode* head, int val)
{
	struct ListNode* prev = NULL;
	struct ListNode* cur = head;

	//while(cur != NULL)
	while (cur)
	{
		if (cur->val == val)
		{
			struct ListNode* next = cur->next;
			free(cur);

			if (prev)
				prev->next = next;

			cur = next;
		}
		else
		{
			prev = cur;
			cur = cur->next;
		}
	}

	return head;
}

int main()
{
	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
	n1->val = 7;
	n2->val = 7;
	n3->val = 7;
	n4->val = 7;

	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = NULL;

	struct ListNode* head = removeElements(n1, 7);

	return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-833483.html

到了这里,关于【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【编织时空四:探究顺序表与链表的数据之旅】

    链表的分类 带头双向循环链表接口实现 顺序表和链表的区别 缓存利用率参考存储体系结构 以及 局部原理性。 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构: 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环  虽然有这么多的链表的结构,但是我们实

    2024年02月12日
    浏览(32)
  • 顺序表与链表

    思维导图:   顺序表与链表都是两种线性表,但是两者之间又有着许多的不同。顺序表是一种连续的空间,实际上就是数组。链表是不连续的空间,链表的空间是一块一块的开辟出来的。 两者的优点与缺点 : 顺序表: 优点: 1.顺序表的空间是连续的,所以能够支持下标的

    2024年02月12日
    浏览(47)
  • 顺序表与链表的区别

    目录 一、顺序表和链表的比较 顺序表 优点: 缺点: 链表 优点 缺点 二、顺序表和链表的区别 1.顺序表和链表都具有增、删、查、改功能,但算法复杂度却不相同。 2、从数据元素存储的内存角度来看 三、顺序表与链表选取方案 顺序表的特点是逻辑上相邻数据元素,物理存

    2024年02月08日
    浏览(35)
  • 《数据结构与算法》之队列与链表复习

    我们在上一次学习了堆栈的数据结构以后,可以了解到它是受限制的操作,比如我们操作只能在栈顶,现在我们要学习的东西叫做队列,它也是受限制的一种数据结构,它的特点是队头只出数据,而队尾只入数据, 它的结构就和它的名字,像我们平时排队一样先来的人肯定要

    2024年02月08日
    浏览(30)
  • 【数据结构】LinkedList与链表

    上节课已经熟悉了ArrayList的使用,并且进行了简单模拟实现。通过源码知道,ArrayList底层使用数组来存储元素: 由于其底层是一段连续空间,当 在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低 ,因此A rrayLi

    2024年02月07日
    浏览(30)
  • 数据结构—LinkedList与链表

    目录 一、链表 1. 链表的概念及结构 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环 二.LinkedList的使用  1.LinkedList概念及结构 2. LinkedList的构造 3. LinkedList的方法 三. ArrayList和LinkedList的区别           链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑

    2024年02月04日
    浏览(36)
  • 【数据结构】顺序表与ArrayList

    作者主页: paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏

    2024年02月08日
    浏览(30)
  • 【数据结构(二)】顺序表与ArrayList

    ❣博主主页: 33的博客❣ ▶文章专栏分类:数据结构◀ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵 关注我带你学更多数据结构知识 在计算机科学中,数据结构是处理和组织数据的方法和技术。顺序表是一种常见的线性表数据结构,它基于数组实现,提供了快速的随机访问能力

    2024年04月12日
    浏览(25)
  • 【数据结构】线性表与顺序表

    ⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 线性表(linear list) 是n个具有相同特性的数据元素的有限序列。 它是一种在实际中广泛使用的数据结构,常见的线性表:顺序表

    2024年02月07日
    浏览(32)
  • 【数据结构】链表与LinkedList

    作者主页: paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包