首页 > 其他分享 >线性表(链表,顺序表)讲解_legend

线性表(链表,顺序表)讲解_legend

时间:2022-12-13 17:35:38浏览次数:69  
标签:顺序 线性表 next 链表 legend 链式 new 节点


线性表(链表,顺序表)讲解_legend_顺序表

线性表(linearList)



(1)线性表的定义:

节点(node)之间具有一对一的前驱后继关系

(2)线性表的存储结构:

(2.1)顺序表 (sequenceList):



(2.2)链式表 (linkList):



(3)顺序表的常见操作:



(初始化+增删改查+表的状态判断)



(3.0)追加(appendNode/addNode)一个节点(node、element) :





(3.1)在特定位置 i 插入(insertElementAt)一个节点:

(3.2)删除(deleteElementAt)某个特定位置 i 的节点 :




(3.3)查找(searchElement/find)值为value 的节点的位置i :

(3.4)改变(changeElementAt)某个节点 :

(3.5)遍历(traverse)整个表 :

(3.6)初始化(init),以及表空(isEmpty),表满(isFull)判断 :

(3.7)获取i号(getNodeAt/getElementAt)节点:



(3) 带头结点的单链表的 常见操作 :



(带有头节点主要是为了方便每个节点都可以有前驱,如果没有头节点,则第一个节点就没有前驱)



(3.1)获取某个节点以及其前驱节点 :



根据节点的值value获取:searchNode

根据索引获取i号节点: getNodeAt



(3.2)添加一个节点 addNode :

(先处理当前节点的next,在处理当前节点的前驱节点的next)

(即先处理该节点指出去的箭头,然后在处理指向该节点的箭头);

(头插法 :不断更新首节点)

(尾插法:不断更新尾节点)



在特定位置i 插入一个节点 insertNodeAt;

(通过调用getNodeAt)



(3.3)删除特定位置i的节点:deleteNodeAt;

(删除一个节点直接处理其前驱节点的next)

(即直接处理指向该节点的箭头。)

   (通过调用getNodeAt)



   通过节点的值value来删除某一个节点 :

   (通过调用searchNode) 



(3.4)遍历链表traverse.



(3.5)初始化链表头节点init,创建链表create 

(不断构造节点,然后addNode即可),释放链表release.



(4)顺序表sequenceList 与 链式表linkList 的区别,优缺点 :



(4.1)区别与优缺点 :



(4.1.1)包含内容:



(1)顺序表包含的 有首节点的指针,以及节点个数len,以及顺序表大小size,就可以进行所有操作。(注:初始化len=0.添加一个元素则先填充元素到len位置,然后len++;所以填元素的范围为0~len-1)



但是链式表只需要包含首节点的指针(不带头节点),或者头节点的指针即可(带有头节点),就可以进行所有的操作。



(2)顺序表与链式表中节点的 定义也是不一样的,链式表中节点中需要加

一个next 指向下一个节点,但是顺序表中不需要。



(4.1.2)操作 :



   (1)顺序表可以直接存取一个节点,但是链式表需要从头遍历存取i号元素;

   (2)顺序表 增加,删除一个节点,需要移动其他节点,链式表可以直接添加,删除。



   (3)由于链式表节点的地址不是连续的,并且node节点中,只有next,所以不可以通过一个节点

   地址来找到其前驱节点,但是顺序表可以。



   所以通常链式表操作中getNodeAt以及searchNode两个函数获取某一个节点地址,还要获取其前一个

   节点的 地址,这样才可以插入一个节点。



   (getNodeAt函数是通过索引i,查找到第i个节点。searchNode就是根据节点内容,找到某个节点。getNodeAt在顺序表以及链式表中都一样,但是searchNode在顺序表中,返回的是节点的索引i,但是在链式表中获得的是该节点指针以及其前驱节点指针,如果获取的是索引i,那么通过getNodeAt也可以获取到节点。)





(5)范例 :

(5.1)顺序表基本操作的范例 :

(5.2)单链表基本操作的范例 :


(5.3)单链表的应用之多项式的运算


---------

(6)单向链表 与 双向链表 的插入与 删除总结:

1)图解:

线性表(链表,顺序表)讲解_legend_顺序表_02


2)单链表的插入,删除解析:

插入:

先处理新节点new的出度:即new->next=p2;

再处理新节点new的入度:即p1->next=new;


删除:

直接将p2的入读连接p2的出度:即p1->next=p2->next;


3)双向链表的插入 ,删除解析;


插入:

先处理new的出度:即new->next=p2;new->prior=p1;

再处理new的入度:即 p1->next=new; p2->prior=new;


删除:

直接将p2的入读连接p2的出度:

即:p1->next=p3;p3->prior=p1;


-----------------------------------

(6) 双向链表 :


(6.1)双向链表图解,以及双向节点图解 :

图解:

线性表(链表,顺序表)讲解_legend_链表_03


(6.2)双向链表的插入 图解 及代码:



图解:

线性表(链表,顺序表)讲解_legend_链表_04




分析:链表节点的插入,先处理该节点指出去的箭头,然后在处理

指向该节点的箭头;


int InsertElemAfter(DBNODEPTR p, elemtype e)
{/*将数据元素e插入到某双向链表中结点p的后面*/
DBNODEPTR q;
q=(DBNODEPTR)malloc(sizeof(DBNODE));/*分配结点*/
if(q==NULL)return 0;
q->data=e;
q->next=p->next;/*①*/
q->prior=p; /*②*/
/*①②为处理该节点指出去的箭头,
③④为处理指向该节点的箭头*/
if(p->next!=NULL)
p->next->prior=q;/*③*/
p->next=q; /*④*/
return 1;
}





(6.3)双向链表的删除 图解 及代码:

图解:

线性表(链表,顺序表)讲解_legend_线性表_05




分析:

删除节点直接处理指向该节点的箭头。

void DeleteElem(DBNODEPTR p)
{/*p是某双向链表中的结点,将p从链表中摘除并释放结点内存*/
DBNODEPTR pre;
pre=p->prior; /*pre指向p的前驱*/
if(pre!=NULL)
pre->next=p->next; /*①*/
if(p->next!=NULL)
p->next->prior=pre; /*②*/
free(p);/*释放p结点内存*/
}


(7) 单链表的操作扩展 :




(7.1)单链表的反转reverse :

(7.2)单链表的排序sort (快速,冒泡,插入,选择):

(7.3)单链表的节点追赶问题 :



(8)顺序表的扩展操作 :


(8.1)重复次数最多的元素 / 重复次数超过一半的元素 :

(8.2)最大和子数组 :

(8.3)最长升序子数组 :

(8.4)数组的反转,循环右移,循环左移 :



(9)注意事项 :



/*

            (1)空节点的 处理 :



            如果原链表中有空节点,则插入一个节点之后还是有空节点的,即使是插在最后一个节点之后。

            因为最后一个节点的next为NULL,即NULL 的前驱为最后一个节点,即使是一个节点插在最后一个节点之后,

            那么NULL 还是会有的。



            所以,链表初始化的时候必须给尾节点的next置为NULL。

            */

标签:顺序,线性表,next,链表,legend,链式,new,节点
From: https://blog.51cto.com/u_15911260/5934919

相关文章

  • 数组的扩展操作_legend
    顺序表sequeceList的扩展操作:(1)数组中的最小元素,以及最小的K个元素:(2)数组中重复次数最多的元素:mostRepeated(2.1)数组中出现次数超过一半的元素:(2.2)出现次数刚好为一半......
  • 单链表的扩展操作21----legend050709
    单链表的操作之补充: (1).单链表的反转: (2).单链表的排序(插入排序,选择排序,冒泡排序等): (3).单链表取得最小值的节点,及其前驱: (4).单链表获取最小的k个节点:(4-1)单链表......
  • Catlan数之栈的出栈序列-legend
    栈的出队顺序问题:(一)Catlan数:(1)给出入栈序列,求出所有的出栈的序列个数: C(2n,n)/(n+1);(2)给出入栈序列,求出所有的出栈序列;1)举例:1、2、3这三个数字,入栈并出栈共有5种方式,分......
  • 约瑟夫环问题——legend
    约瑟夫环问题:(一)问题:已知有n个人(编号为1,2,3...n)围坐在一个圆桌周围,从编号为k的人开始报数,数到m的那个人出队,出队的下一个位置的人继续从k开始数数,数到m的那个人继续......
  • 707. 设计链表
    设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向......
  • 环形链表II
    题目地址(142.环形链表II)​​https://leetcode-cn.com/problems/linked-list-cycle-ii/​​题目描述给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回nu......
  • O(1)空间复杂度找到相交链表的交点
      相交链表编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:​​​​在节点c1开始相交。解题思路:首先将一条链首尾连起来,这时候就变成了找环的入口点的问题......
  • #yyds干货盘点# LeetCode程序员面试金典:链表相交
    题目:给你两个单链表的头节点 headA​ 和 headB​ ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目......
  • #yyds干货盘点# LeetCode程序员面试金典:回文链表
    题目:编写一个函数,检查输入的链表是否是回文的。 示例1:输入:1->2输出:false示例2:输入:1->2->2->1输出:true代码实现:classSolution{publicbooleanisPalindrome(L......
  • 代码随想录算法训练营Day04: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试
    24. 两两交换链表中的节点tag:#链表#反转leetcode地址:24. 两两交换链表中的节点代码:functionswapPairs(head:ListNode|null):ListNode|null{constre......