03线性表之链表

Posted 再吃一个橘子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03线性表之链表相关的知识,希望对你有一定的参考价值。

肚子饿了就要吃   ~   嗝  ——— 路飞 

1.本章重点

  1. 链表表示和实现(单链表+双链表)
  2. 链表的常见OJ题
  3. 顺序表和链表的区别和联系

2.为什么需要链表

引子:顺序表的问题及思考

(1)动态顺序表

特点

  1. 插入数据,空间不够了,需要增容。
  2. 要求数据是依次存储的。

缺陷:

  1. 如果空间不够,增容。增容会付出一定的性能消耗,需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  2. 增容,可能存在增容后的空间有所浪费。(   增容一般都是增容2倍  )
  3. 头部或者中部左右插入数据,要求依次移动,插入效率低下。(   O(N)  )

(2)如何解决:

  1. 按需求给空间(存一个给一个)。
  2. 不需要物理空间连续,头部和中部的插入,不需要挪动数据。

这就引出了一个新的物理存储结构    ————>   链表

3.链表的概念及结构

概念:链表是一种物理存储结构上非连续非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

逻辑结构(想象出来的),如图:(单链表为例)

物理结构(在内存中的结构),如图:(单链表为例)

实际中要实现的链表的结构非常多样,以下情况组合起来就有8种链表结构:

  1. 单向,双向
  2. 带头,不带头
  3. 循环,非循环

虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:

1. 无头单向非循环链表:

结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

2. 带头双向循环链表:

结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。

4.单链表的实现

注:

plist/phead——>头指针(一般保持不动)

cur——>当前位置(  current简写)

 

 

找尾巴注意的点:

对比

	//错误代码
    //找到原来的尾巴(进而插尾)
	SLTNode* tail = phead;
	while (tail != NULL)
	{
		tail = tail->next;
	}
	//正确代码
    //找到原来的尾巴(进而插尾)
	SLTNode* tail = phead;
	while (tail->next != NULL)
	{
		tail = tail->next;
	}

解释:

第一段代码是错误的,因为

以上是关于03线性表之链表的主要内容,如果未能解决你的问题,请参考以下文章

Java数据结构线性表之链表

Java数据结构线性表之链表

线性表之链表C语言

线性表之链表

C语言 严蔚敏数据结构 线性表之链表实现

线性表之链表源码