1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表

2024-02-03 23:32

本文主要是介绍1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.删除一个无头单链表的非尾节点


这里主要是采用数据替换,将需要删除的节点的下一个结点放在需要删除结点的位置,依次将需要删除结点的后续结点前移,即可完成删除。

void DeleteNotTail(pNode pos)
{
pNode cur = pos->_next;
assert(pos->_next);          //数据替换
pos->_data = pos->_next->_data;
pos->_next = pos->_next->_next;
}

 2.从尾到头打印单链表 

主要有两种方法:

(1)非递归实现:

若只有一个结点或没有结点直接返回,有多个结点时需要逆置。

void PrintfReverseNon(pList* pplist)     //非递归实现
{
pList cur = *pplist;
pList newList = NULL;
assert(pplist);
if ((*pplist == NULL) || ((*pplist)->_next == NULL))
{
return;
}
while (cur)
{
pNode tmp = cur;
cur = cur->_next;
tmp->_next = newList;
newList = tmp;
}
*pplist = newList;
}

(2)递归实现

同样,没有结点直接返回,有多个结点时,找第一个节点的下一个结点,直到找到该链表的最后一个结点,打印出该节点的数据,相当于栈,先将数据一次放入栈中,直到所有的数据完全放入,再一次弹出栈,即可完成逆置。

void PrintfReverse(pList plist)        //递归实现
{
pNode cur = plist;
if (cur==NULL)
{
return;
}
if (cur->_next)
{
PrintfReverse(cur->_next);
}
printf(" %d\n",cur->_data);
}

完整代码:

#include #include #include typedef int DataType;
typedef struct ListNode
{
DataType _data;
struct ListNode* _next;
}Node,*pNode,*pList;
void Init(pList* pplist)
{
assert(pplist);
*pplist = NULL;
}
pNode BuyNode(DataType x)
{
pNode pnode = (pNode)malloc(sizeof(Node));
if (pnode == NULL)
{
perror("malloc");
return NULL;
}
pnode->_data = x;
pnode->_next = NULL;
return pnode;
}
void Push(pList* pplist,DataType x)
{
pNode NewNode = BuyNode(x);
if (*pplist == NULL)
{
*pplist = NewNode;
}
else
{
pNode cur = *pplist;
while (cur->_next)
{
cur = cur->_next;
}
cur->_next = NewNode;
}
}
pNode Find(pList plist,DataType x)
{
if (plist == NULL)
{
return NULL;
}
else
{
pNode cur = plist;
while (cur)
{
if (cur->_data == x)
{
return cur;
}
cur = cur->_next;
}
return NULL;
}
}
void DeleteNotTail(pNode pos)
{
pNode cur = pos->_next;
assert(pos->_next);          //数据替换
pos->_data = pos->_next->_data;
pos->_next = pos->_next->_next;
}
void PrintfReverseNon(pList* pplist)     //非递归实现
{
pList cur = *pplist;
pList newList = NULL;
assert(pplist);
if ((*pplist == NULL) || ((*pplist)->_next == NULL))
{
return;
}
while (cur)
{
pNode tmp = cur;
cur = cur->_next;
tmp->_next = newList;
newList = tmp;
}
*pplist = newList;
}
void PrintfReverse(pList plist)        //递归实现
{
pNode cur = plist;
if (cur==NULL)
{
return;
}
if (cur->_next)
{
PrintfReverse(cur->_next);
}
printf(" %d\n",cur->_data);
}
void Printf(pList plist)
{
pNode cur = plist;
while (cur)
{
printf(" %d", cur->_data);
cur = cur->_next;
}
printf(" NULL\n");
}
void Test()
{
pList plist;
Init(&plist);
Push(&plist, 1);
Push(&plist, 2);
Push(&plist, 3);
Push(&plist, 4);
Push(&plist, 5);
Printf(plist);
pNode ret = NULL;
ret = Find(plist, 4);
/*if (ret != NULL)
{
printf("找到了\n");
}
else
{
printf("没找到\n");
}*/
DeleteNotTail(ret);
Printf(plist);
PrintfReverse(plist);
PrintfReverseNon(&plist);
Printf(plist);
}

这篇关于1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675755

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Python按条件批量删除TXT文件行工具

《Python按条件批量删除TXT文件行工具》这篇文章主要为大家详细介绍了Python如何实现按条件批量删除TXT文件中行的工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.简介2.运行效果3.相关源码1.简介一个由python编写android的可根据TXT文件按条件批

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C