本系列文章简要介绍链表的相关知识。

本文是系列文章的第三篇,将介绍在单向链表中删除节点的方法,并给出代码示例。

1 概述

在单向链表中删除节点,首先要根据预先确定的节点标志,判断待删除节点是否存在于链表之中,如果链表中不存在该节点,则无需进行删除操作。如果该节点存在于链表之中,在删除该节点时,还需要区分以下两种情况:

  • 待删除节点是链表的首节点;
  • 待删除节点不是链表的首节点(即该节点是中间节点或末尾节点)。

下面通过伪代码的形式介绍在单向链表中删除节点的算法。

算法:DeleteLinkedlist(list,target)
目的:在单向链表中删除节点
前提:链表和要删除的节点信息
后续:无
返回:新链表
{if (list == null)           // empty list{// nothing to doreturn}cur <- listwhile (((*cur).num != (*target).num) && ((*cur).link != null))    // find target node location{pre <- curcur <- (*cur).link}if ((*cur).num == (*target).num)    // target node in the list{if (list == cur)                // target node is the first node{list <- (*cur).link}else                            // target node is not the first node{(*pre).link <- (*cur).link}}else{// target node not found}return list
}

2 代码示例

根据上述内容,可以编写在单向链表中删除节点的代码示例。

代码示例内容如下:

#include <stdio.h>#define STRUCT_LEN sizeof(struct student)struct student
{int stu_num;                /* student number */float stu_score;            /* student score */struct student* next;
};int main()
{/* declaration of func */struct student * delete(struct student * head, struct student * target_node);void print(struct student * list);/* create a static linked list */struct student * list;struct student stu_1, stu_2, stu_3;stu_1.stu_num = 1;stu_1.stu_score = 88;stu_2.stu_num = 2;stu_2.stu_score = 66;stu_3.stu_num = 3;stu_3.stu_score = 100;list = &stu_1;stu_1.next = &stu_2;stu_2.next = &stu_3;stu_3.next = NULL;/* print linked list before deletion */printf("before deletion, ");print(list);/* create target node that to be deleted from linked list */struct student stu_del;stu_del.stu_num = 3;stu_del.stu_score = 0;         /* any value, because this item not compare *//* delete target node from linked list */list = delete(list, &stu_del);/* print linked list after deletion */printf("after deletion, ");print(list);return 0;
}/*
** this is the delete linked list function.
*/
struct student * delete(struct student * head, struct student * target_node)
{struct student * cur;struct student * pre;struct student * target;cur = head;                 /* let cur point first node */target = target_node;       /* let target point the node that to be deleted */if (NULL == head)           /* empty list */{printf("list is null!\n");return head;}while (((*target).stu_num != (*cur).stu_num) && ((*cur).next != NULL))  /* find target node location */{pre = cur;cur = (*cur).next;}if ((*target).stu_num == (*cur).stu_num)        /* target node in the list */{if (head == cur)                        /* target node is the first node */{head = (*cur).next;}else                                    /* target node is not the first node */{(*pre).next = (*cur).next;}}else{printf("\ntarget node not found!\n\n");}return head;
}/*
*  this is the print linked list content function.
*/
void print(struct student * list)
{struct student *walker;walker = list;printf("the linked list contents(student number and score) as followed:\n");printf("[student number] [student score]\n");while (walker != NULL){printf("%d                %-f\n", (*walker).stu_num, (*walker).stu_score);walker = (*walker).next;}return;
}

上述代码的编译及运行结果如下:

说明:

  • 上述代码中使用了待删除节点的学生学号信息“std_num”作为删除标志,除此之外的待删除节点的其他信息,不影响节点删除逻辑;
  • 为了验证在待删除节点是链表首节点、链表中间节点和链表末尾节点的情况,可以通过修改待删除节点的结构体成员“stu_del.stu_num”的值,进行对应的测试;(上面已给出了这几种场景对应的测试结果)
  • 为了简化代码内容,上述代码示例使用的是静态链表,即链表的所有节点都是在程序中定义的,节点的存储空间不是临时开辟的。

链表简介(三)——在单向链表中删除节点相关推荐

  1. 无头结点单链表的逆置_从无头单链表中删除节点及单链表的逆置

    题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点).请将该节点从单链表中删除. 解答: 典型的"狸猫换太子", 若要删除该 ...

  2. JavaScript的数据结构与算法(三) —— 单向链表

    链表 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的.每个元素由一个存储元素本事的节点和一个指向下一个元素的引用组成.相对于传统的数组,链表的一个好处在于,添加或者删除元素 ...

  3. 【C++】【三】单向链表

    // 单向链表.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. //#include <iostream> #include<stdli ...

  4. 从无头单链表中删除节点 结构之法 4

    题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除. 分析与解答: 假设给定的指针为pCurrent,Node *pN ...

  5. 编程之美-从无头单链表中删除节点方法整理

    [试题描述] 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除. 程序:

  6. 从无头单链表中删除节点

    #include<iostream> using namespace std;struct Node{int data;Node* next; };void deleteNode(Node ...

  7. 链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶)

    题目 给定一个单向链表头节点head,和一个整数pivot. 实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的.调整后的节点顺序要保持与原链表中节点的先后次序一 ...

  8. 数据结构链表之单向链表:Python3 实现单向链表——1

    Python3 实现单向链表 链表定义与简介 定义:链表与顺序表(Python中列表)性质相反,链表是物理单元上非顺序的.非连续的,在逻辑顺序上其数据元素是通过指针实现的,组成链表的每一个元素也可以叫 ...

  9. [******] 链表问题:将单向链表按某值划分成左边小、中间相等、右边大的形式...

    问题描述 普通问题:给定一个单向链表的头节点head,节点的值类型是整数,再给定一个整数 pivot,实现一个调整链表的函数: 使得左半部分的值都是小于pivot的节点,中间部分都是等于pivot的节 ...

  10. 链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(初阶)

    题目 给定一个单向链表头节点head,和一个整数pivot. 实现一个调整链表的函数,将链表调整为左部分小于pivot,中间等于,右边大于pivot的.对调整后的节点顺序没有更多的要求 链表9-> ...

最新文章

  1. 定时备份_如何将电脑中的文件进行定时备份?
  2. Algorithm:机械优化设计的数学模型简介、常用优化方法、优化计算工具简介之详细攻略
  3. 当选51CTO技术论坛2010年度十大杰出版主感言
  4. 教你如何在linux 下批量卸载
  5. 【Python实战】使用python批量生成发票
  6. websocket 连接本地端口_Web应用架构WebSocket 协议介绍
  7. ASP.NET 3.5中的ListView控件和DataPager控件(一)
  8. 异步线程AsyncTask_2示例(07)
  9. linux硬盘分区为什么总有1M,3步实现制作并挂载自己的Linux硬盘分区
  10. oralcle中的性能统计基本用法statpack
  11. dropwizard 连接mysql_Dropwizard(二) hibernate连接Mysql数据库
  12. MS OFFICE在LINUX上的视觉效果跟WINDOWS相差太大
  13. Java正则表达式实现计算器_Python利用正则表达式实现计算器算法思路解析
  14. 汇总好玩的cmd命令大全
  15. 如何使用Firepath工具方法定位元素
  16. 双霖度盘下载器(第三方百度网盘不限速下载工具)
  17. 华为HG8245光纤猫获得超级用户密码
  18. c/c++背景颜色和字体颜色
  19. 驰为 hi12 linux,PC商务体验 Intel四核平板驰为Hi12评测
  20. 【网站技术解析③】--织梦入门使用教程

热门文章

  1. Windows核心编程_组件透明
  2. 微信小程序多位验证码/密码输入框
  3. 关于项目中解决bug的心得
  4. Android Studio安装、配置教程全 - 安卓开发环境的配置手册
  5. 数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”
  6. Web前端面试指导(十七):一个满屏 品 字布局 如何设计?
  7. POJ 3126 Prime Path 简单广搜(BFS)
  8. csv数据源的创建(一)
  9. 2018-2019-2 20162318《网络对抗技术》Exp2 后门原理与实践
  10. 第二届蓝桥杯省赛---夺冠概率