删去单链表中第i个节点的操作。删除单链表中数据域为x的前驱元素。数据结构。
2017-10-03 21:09
501 查看
如何删除单链表中第i个节点?
先来看看删除的原理:因为数据结构是单链表,要想删除第i个节点,就要找到第i个节点;要想找到第i个节点,就要找到第i-1个节点;要想找到第i-1个节点,就要找到第i-2个节点......于是就要从第一个节点开始找起,一直找到第i-1个节点。如何找?让一个指针从头结点开始移动,一直移动到第i-1个节点为止。这个过程中可以用一个变量j从0开始计数,一直自增到i-1。之后呢?我们把第i-1个节点找到了,就让它的指针域指向第i+1个节点,这样就达到了删除的目的。而第i+1个节点的地址又从第i个节点获得,第i个节点的地址又是第i-1个节点的后继。因此我们可以这样做:先让一个指针指向第i-1个节点的后继,(保存i+1节点的地址),再让i-1节点的后继指向第i个节点的后继,这样就将第i个节点删除了。
再来看看删除的时候会遇到什么意外情况:
1.有可能单链表一开始就为空。这样的话连第i-1个元素都找不到。
2.有可能找不到第i个节点,原因是第i-1的后继为空。
3.有可能删除的位置不合理,比如删除第-1个节点。
如何删除单链表中数据域为x的前驱节点?
这个删除操作其实和上面的类似。关键是要知道三个地址,p->第i-2个节点的地址,q->第i-1个节点的地址,r->元素为x的第i个节点的地址。(为什么?因为我们要删除的是第i-1个节点。要想删除它,就既要找到第i-2个节点,又要找到元素为x的第i个节点)假设三个指针,p,q,r。p=L(L为头结点的地址)。q=p->next;(这里要注意先判断q是否为空?如果q为空,意味着L->next为空。空链表,不予受理!!!!!!)
r=q->next;(这样子,三个指针就连续了)
当r->data!=X,并且r!=null时(最前面的指针指向的节点数据域不是x,并且这个指针有节点去指向)
让指针移动,p=q;q=r;r=r->next;这样就找到了满足条件的三个地址。
找到了地址,下一步是删除。要注意的一点是,什么时候可以删除?只有当r!=null,才能删。否则不满足题目一开始的条件了。
删除操作:p->next=q->next;free(q);
相关文章推荐
- 数据结构(第二天)单链表的基本操作,创建单链表,头插法,尾插法,删除节点,查询节点
- 【1138】数据结构上机测试2-1:单链表操作A(顺序建表+删除节点)(SDUT)
- 【1138】数据结构上机测试2-1:单链表操作A(顺序建表+删除节点)(SDUT)
- 数据结构—链表-单链表应用-删除元素最大的节点
- 数据结构——单链表的创建、删除、遍历以及节点的插入、删除等操作
- 【1139】数据结构上机测试2-2:单链表操作B (逆序建表+重复元素删除)
- 【1139】数据结构上机测试2-2:单链表操作B (逆序建表+重复元素删除)
- 数据结构——链表之单链表重复元素的删除
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- 【数据结构】单链表(一)单链表的定义,插入,删除和查找操作
- 数据结构之单链表删除第i个元素并用e返回其值的算法
- 数据结构——10 双向链表插入和删除节点
- 数据结构 单链表插入删除操作(c语言实现)
- 从无头单链表中删除节点及单链表的反转操作
- 暑假集训第1天链表-数据结构实验之链表七:单链表中重复元素的删除
- 数据结构实验之链表七:单链表中重复元素的删除
- 设计一个整型链表类list,能够实现链表节点的插入、删除、以及链表数据的输出操作。
- 2122数据结构实验之链表七:单链表中重复元素的删除
- 数据结构实验之链表七:单链表中重复元素的删除
- 实战数据结构(2)_两个单链表间的删除操作