数据结构--单链表的插入删除

news/2024/11/20 7:22:39/

数据结构–单链表的插入&删除

目标
单链表的插入(位插、前插、后插)
单链表的删除

单链表的插入

按为序插入(带头结点)

ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。

思路:找到第i-1个结点,将新结点插入其后

代码实现

typedef struct LNode
{ElemType data;  struct LNode *next; 
}LNode, *LinkList;bool ListInsert(LinkList &L, int i, ElemType e)
{if (i < 1)  return false;LNode *p = L; //L指向头结点,头结点是第0个结点(不存数据)int j = 0; //当前p指向的是第几个结点while (p != NULL && j < i - 1) //循环找到第i-1个结点{p = p->next;j++;}if (p == NULL)  return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->next = p->next;s->data = e;p->next = s;return true;
}

时间复杂度

最好时间复杂度 O(1)
最坏时间复杂度 O(1)
平均时间复杂度 O(1)

按位序插入(不带头结点)

思路:找到第i-1个结点,将新结点插入其后

代码实现

typedef struct LNode
{ElemType data;  struct LNode *next; 
}LNode, *LinkList;bool ListInsert(LinkList &L, int i, ElemType e)
{if (i < 1)  return false;if (i == 1) //插入第1个结点的操作与其他结点操作不同{LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = L;L = s;return true;}LNode *p = L; //L指向头结点,头结点是第0个结点(不存数据)int j = 0; //当前p指向的是第几个结点while (p != NULL && j < i - 1) //循环找到第i-1个结点{p = p->next;j++;}if (p == NULL)  return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->next = p->next;s->data = e;p->next = s;return true;
}

结论:
不带头写代码更不方便,推荐用带头结点
注意:考试中带头、不带头都有可能考察,注意审题

指定结点的后插操作

代码实现
typedef struct LNode
{ElemType data;struct LNode *next;
}LNode, *LinkList;bool InsertNextNode(LNode* p, ElemType e)
{if (p == NULL)  return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL)  return false; // 内存分配失败s->data = e;s->next = p->next;p->next = s;return true;
}

指定结点的前插操作

前插操作:在p结点之前插入元素e
bool InsertPriorNode (LNode *p,ElemType e)

方法一:
bool InsertPriorNode (LinkListL L, Node *p,ElemType e)
传入头指针,循环查找p的前驱,再对q后插
时间复杂度:O(n)

方法二 \color{red}方法二 方法二

方法二实现代码

typedef struct LNode
{ElemType data;struct LNode *next;
}LNode, *LinkList;bool InsertPriorNode (LNode *p,ElemType e)
{if (p == NULL)  return false;LNode* s = (LNode*)malloc(sizeof(LNode));if (s == NULL)  return false;s->next = p->next;p->next = s; //新结点s连到p之后s->data = p->data; //将p中元素复制到s中p->data = e; //p 中元素覆盖为ereturn true;
}

时间复杂度: O(n)

前插操作:在p结点之前插入结点 s

代码实现
bool InsertPriorNode(LNode* p, LNode* s)
{if (p == NULL || s == NULL) return false;s->next = p->next;p->next = s;ElemType tmp = p->data;p->data = s->data;s->data = tmp;return true;
}

单链表的删除

按位序删除(带头结点)

ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

方法:
找到第i-1个结点,将其指针指向第i+1个结点,并释放第i个结点

代码实现

typedef struct LNode
{ElemType data;struct LNode *next;
}LNode, *LinkList;bool ListDelete(LinkList &L, int i, ElemType &e)
{if (i < 1)  return false;LNode *p = L;int j = 0;while (p != NULL && j < i - 1){p = p->next;j++;}if (p == NULL)  return false;if (p->next == NULL)    return false; //第i-1个结点之后已无其他结点LNode* q = p->next;e = q->data; //用e返回元素的值p->next = q->next; //将*q结点从链中“断开"free(q); //释放结点的存储空间return true;
}

时间复杂度:O(n)

删除指定结点p

bool DeleteNode ( LNode *p)

方法1:传入头指针,循环寻找p的前驱结点
时间复杂度O(n)
方法2:偷天换日(类似于结点前插的实现)
时间复杂度O(1)

方法二代码实现
typedef struct LNode
{ElemType data;struct LNode *next;
}LNode, *LinkList;bool DeleteNode(LNode* p)
{if (p == NULL)  return false;LNode* q = p->next; //令q指向*p的后继结点p->data = p->next->data; //和后继结点交换数据域p->next = q->next; //将*q结点从链中"断开"free(q);return true;
}

注: \color{red}注: 注:
如果 p 是最后一个结点,只能从表头开始依次寻找 p 的前驱 , 时间复杂度 O ( n ) \color{red} 如果p是最后一个结点,只能从表头开始依次寻找p的前驱,时间复杂度O(n) 如果p是最后一个结点,只能从表头开始依次寻找p的前驱,时间复杂度O(n)

知识点回顾与重要考点


http://www.ppmy.cn/news/625031.html

相关文章

lol聊天服务器一直连不上,关于LOL无法连接聊天服务器的解决方法!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 皮尔特沃夫 115.236.139.145 hn5-ejabberd1.lol.qq.com 班德尔城 182.131.31.14 hn4-ejabberd1.lol.qq.com 诺克萨斯 183.60.163.59 hn3-ejabberd1.lol.qq.com 183.60.163.59 hn3-ejabberd2.lol.qq.com 祖安 115.236.97.162 hn2-e…

影流服务器显示无法连接服务器,腾讯服务器崩溃?王者荣耀网络异常,LOL服务器也炸了...

原标题&#xff1a;腾讯服务器崩溃&#xff1f;王者荣耀网络异常&#xff0c;LOL服务器也炸了 3月23日&#xff0c;来自王者荣耀和英雄联盟的玩家纷纷在游戏中受到了网络异常和游戏延迟&#xff0c;虽然英雄联盟中服务器经常网络波动&#xff0c;官方还为此道过谦&#xff0c;赠…

lol服务器维修2019,lol服务器是不是炸了 2019年3月23出现预料之外的错误

lol服务器是不是又炸了&#xff0c;相信今天很多朋友都发现自己能够进入lol客户端&#xff0c;但是除了自定义单机以外其他模式都登陆不进去&#xff0c;总是会出现预料之外的错误这个提示&#xff0c;如果有朋友有号的区很多&#xff0c;那么大家会发现该情况只出现在部分服务…

均衡教派服务器维护,LOL十大最坑大区盘点 LOL最坑服务器 均衡教派坐实榜首

在 LOL 当中,有时候坑的玩家是扎堆存在,也就有了各大区之间玩家水平的差距,那么,在 LOL 当中那个区最坑呢,小编今天就给大家仔细分析一下吧。 TOP10. 艾欧尼亚 有人说这是水平最好的区之一,我只想加个后缀:仅限于高分段。艾欧尼亚不到 30 级的匹配,那真的是越玩越呵呵了…

配合python的rich库实现高颜值LOL服务器状态查询

先上图看效果 实现方法 第一步&#xff1a;获取LOL服务器状态信息 需要安装requests库 在lol服务器状态查询的官方页面&#xff08;https://lol.qq.com/act/a20150326dqpd/&#xff09;上按下F12打开开发者工具按下ctrlR刷新页面不难发现其服务器状态是通过该链接获取的&#…

LOL各大服务器所在位置,LOL各大服务器所在地,8个大区全都在广东,是其他省的两倍...

现在电竞行业是很多人在关注的&#xff0c;我们看到电竞行业热度一高&#xff0c;也带动了玩家的热度&#xff0c;玩家数量在不断的上升&#xff0c;就目前的数据看&#xff0c;英雄联盟是目前游戏玩家数量最多的端游&#xff0c;电竞比赛也是最多人关注的&#xff0c;就目前的…

Arch Linux 中的 AUR 是什么?您应该使用它吗?

Arch Linux AUR 存储库包含社区驱动的软件,如果您采取一些简单的预防措施,就可以安全使用。即使您不懂 shell 脚本,也可以使用一些指标来判断包是否安全。 AUR 是 Arch Linux 皇冠上的宝石之一,提供了数千个附加软件包。但是这个用户驱动的存储库使用起来安全吗,还是应该避…

小驰私房菜_16_高通设备开机模式

[Android基础] [qcom开机模式] 用的比较多的可能是 adb reboot bootloader 和 adb reboot edl。 这2个命令都是刷机的时候会用到。 adb reboot bootloader 是进入bootloader模式&#xff0c;通过fastboot 命令来刷img文件。 adb reboot edl 是进入紧急下载模式&#xff0c;进而…