无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题
对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针。在下面本人实现了 单链表的 增 删 插 查 改。
#include
#include
#include
#include
typedef int Datatype;
typedef struct SListNode
{
Datatype data;
struct SListNode*next;
}SListNode;
void PushBack(SListNode*&pHead, Datatype x);
void PopBack(SListNode *&pHead);
void PrintSlist(SListNode *&PHead);
void PushFrot(SListNode*&pHead,Datatype x);
void PopFront(SListNode*&pHead);
SListNode *Find(SListNode*pHead, Datatype x);
//void Insert(SListNode*pHead, Datatype pos, Datatype x);
void Insert(SListNode*pHead, Datatype x);
void Erase(SListNode*&pHead,SListNode *pos );
void InsertNoNode(SListNode *pos, Datatype x);
SListNode* _BuyNode(Datatype x)
{
SListNode *temp = (SListNode*)malloc(sizeof(SListNode));
temp->data = x;
temp->next = NULL;
return temp;
}
void PushBack(SListNode*&pHead, Datatype x)
{
//1 空 2 不为空
if (pHead == NULL)
{
pHead = _BuyNode(x);
}
else
{
SListNode *tail = pHead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = _BuyNode(x);
}
}
void PopBack(SListNode *&pHead)
{
//1空 2 一个节点 3 多个节点
if(pHead == NULL)
{
return;
}
else if (pHead->next == NULL)
{
free(pHead);
pHead = NULL;
}
else{
SListNode *tail = pHead;
SListNode *tem = NULL;
while (tail->next != NULL)
{
tem = tail;
tail = tail->next;
}
free(tail);
tem->next = NULL;
}
}
void PrintSlist(SListNode *&PHead) //打印链表
{
SListNode*cur = PHead;
while (cur!=NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
void PushFrot(SListNode*&pHead, Datatype x) //头插
{
if (pHead == NULL)
{
pHead = _BuyNode(x);
}
else
{
SListNode *tmp = _BuyNode(x);
tmp->next = pHead;
pHead = tmp;
}
}
void PopFront(SListNode*&pHead) //单链表头删
{
//1 空
//2 一个结点
//3 一个以上的节点
if (pHead == NULL)
{
return;
}
else if(pHead->next == NULL)
{
free(pHead);
pHead = NULL;
}
else
{
SListNode *tmp = pHead;
pHead = pHead->next;
free(tmp);
}
}
SListNode *Find(SListNode*pHead, Datatype x) //查找节点
{
//assert(pHead);
SListNode *tail = NULL;//当前指针
Datatype tmp ; //保存节点数据
if (pHead->data == x)
{
return pHead;
}
else
{
tail=pHead->next;
while (tail!= NULL)
{
tmp = tail->data;
if (tmp == x) //把节点数据与要查找的数比较
{
return tail; //返回所要查找结点的地址
}
else
{
tail =tail->next;
}
}
printf("没有查到该数据!\n");
}
}
void Insert(SListNode*pos, Datatype x) 在指定节点 插入数据
{
assert(pos);
SListNode *tmp = _BuyNode(x);
tmp->next = pos->next;
pos->next = tmp;
}
void Erase(SListNode *&pHead,SListNode *pos) //删除指定位置的节点
{
assert(pos);
assert(pHead);
if (pHead == pos)
{
pHead = pHead->next;
free(pos);
return;
}
SListNode *prv = pHead;
while (prv)
{
if (prv->next == pos)
{
prv->next = pos->next;
free(pos);
break;
}
prv = prv->next;
}
}
//删除一个无头单链表
void DelNoNode(SListNode *pos)
{
assert(pos);
assert(pos->next);
SListNode *del = pos->next;
SListNode *next = del->next;
pos->data = del->data;
pos->next = next;
free(del);
}
//在无头单链表的一个非头节点前插入一个节点
void InsertNoNode(SListNode *pos, Datatype x)
{
assert(pos);
//assert(pos->next);
//1 种方法//Datatype temp = 0;
//SListNode *behind = pos;
//SListNode*prv =_BuyNode(x);
//SListNode *next = behind->next;
//pos->next = prv;
//prv->next = next;
//temp = pos->data;
//pos->data = prv->data;
//prv->data = temp;
//2 种方法
SListNode*prv = _BuyNode(pos->data);
prv->next = pos->next;
pos->next = prv;
pos->data = x;
}
//查找中间节点
SListNode *FindmidNode(SListNode *phead)
{
SListNode *fast = phead;
SListNode *slow = phead;
while (fast&&fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
//找倒数第k个节点
SListNode *FindkNode(SListNode *phead, int k)
{
SListNode *fast = phead;
SListNode *slow = phead;
/*for (int i = 1; i<=k-1; i++)
{
fast = fast->next;
}
while (fast->next)
{
slow = slow->next;
fast = fast->next;
}*/
while (fast&&k--)
{
fast= fast->next;
if (fast == NULL)
return NULL;
}
while (fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
//从尾到头打印链表
void PrintTailToHead(SListNode*phead)
{
if (phead)
{
PrintTailToHead(phead->next);
printf("%d ", phead->data);
}
}
//
SListNode *Reverse(SListNode *phead)//单链表的逆置
{
SListNode *cur = phead;
SListNode *newhead = NULL;
while (cur)
{
SListNode*tmp =cur;
cur = cur->next;
tmp->next =newhead;
newhead = tmp;
}
return newhead;
}
void test1()
{
SListNode*list = NULL;
PushBack(list, 1);
PushBack(list, 3);
PushBack(list, 2);
PushBack(list, 4);
PushBack(list, 6);
PrintSlist(list);
}
void test2()
{
SListNode*list = NULL;
PushBack(list, 1);
PushBack(list, 2);
PushBack(list, 3);
PushBack(list, 4);
PushBack(list, 5);
PushBack(list, 6);
PushBack(list, 7);
PrintSlist(list);
//Find(list, 4);
//Insert(list,7, 8);
SListNode *pos = Find(list, 1);
Erase(list,pos );
PrintSlist(list);
}
void test3()
{
SListNode*list = NULL;
PushBack(list, 1);
PushBack(list, 2);
PushBack(list, 3);
PushBack(list, 4);
PushBack(list, 5);
PushBack(list, 6);
PushBack(list, 7);
PrintSlist(list);
SListNode *pos = Find(list ,7);
Insert(pos, 2);
PrintSlist(list);
}
void test4()
{
SListNode*list = NULL;
PushBack(list, 1);
PushBack(list, 2);
PushBack(list, 3);
PushBack(list, 4);
PushBack(list, 5);
PushBack(list, 6);
PushBack(list, 7);
PrintSlist(list);
/*SListNode *pos = list;
DelNoNode(pos);*/
SListNode *pos = Find(list,1);
InsertNoNode(pos, 9);
PrintSlist(list);
}
void test5()
{
SListNode *list = NULL;
PushBack(list, 1);
PushBack(list, 8);
PushBack(list, 2);
PushBack(list, 3);
PushBack(list, 4);
PushBack(list, 5);
PrintSlist(list);
//SListNode*pos = FindmidNode(list);
SListNode*pos =FindkNode(list, 5);
printf("%d\n", pos->data);
//PrintSlist(list);
}
void test6()
{
SListNode*list = NULL;
PushBack(list, 1);
PushBack(list, 3);
PushBack(list, 2);
PushBack(list, 4);
PushBack(list, 6);
//
SListNode*pos=Reverse(list);
PrintTailToHead(pos);
}
int main()
{
//test1();
test6();
system("pause");
return 0;
}
以上如果发现有错的地方或者还有其他建议,希望提出宝贵意见。谢谢!!!
无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题相关推荐
- 22 链表中倒数第k个节点
22 链表中倒数第k个节点 为了实现只遍历一次就能找到倒数第kkk个节点,我们可以定义两个指针.第一个指针从链表的头指针开始遍历向前走k−1k-1k−1步,第二个指针保持不动:从第kkk步开始,第二个 ...
- python 链表倒数第k个节点_链表-删除单链表中倒数第k个节点
题目 实现一个函数,一个可以删除单链表中倒数第k个节点 难度 简单 分析 本题比较简单,实现方法多种多样,这里提供一种方法 首先明确一点,在单链表中删除倒数第k个节点,需要找到他的前一个节点,让前一个 ...
- 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...
点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...
- 单链表倒数第K个节点的查找和显示
单链表倒数第K个节点的查找和显示 最近在学回顾之前学到的知识,正好碰到了关于链表查找的一道面试题,在此贴出来,与小伙伴们共同交流~ 在刚看到题目,其实很容易就想到一个方法,就是先求链表的长度(leng ...
- python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法
本文实例为大家分享了python实现单链表中删除倒数第K个节点的具体代码,供大家参考,具体内容如下 题目: 给定一个链表,删除其中倒数第k个节点. 代码: class LinkedListAlgori ...
- 链表之删除单链表倒数第K个节点
删除单链表倒数第K个节点 题目: 删除单链表中倒数第K个节点, 思路: 给我们一个单链表,我们需要删除倒数第K个节点,比如链表每个节点值是1.2.3.4.5.6 K值是 ...
- c语言单链表删除倒数第k个数,在单链表中删除倒数第k个节点
实现方式很多,在这里只说两种实现方式.看不懂时候,大家可以画画图,对理解为什么很有帮助. 第一种方式: 1.首先判断K值和链表是否为空,如果k<=0,或链表为空,直接返回head: 2.满足上面 ...
- 【小f的刷题笔记】(JS)链表 - 单链表的倒数第 k 个节点 LeetCode19 单链表的中点 LeetCode876
[链表] 一.单链表的倒数第 k 个节点: ✔ 要求:只遍历一遍,链表有多长未知 LeetCode19 链接: 19.删除链表的倒数第N个结点 题目: 思路: 因为没有给头结点,我们就先定义一个哑结点 ...
- 链表问题2——在单链表中删除倒数第K个节点
题目 实现一个函数,可以删除单链表中倒数第K个节点. 要求 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 思路 如果链表为空或者K值小于1,直接返回head即可,除此之外,从 ...
最新文章
- 水稻微生物组时间序列分析2a-相关分析
- 鸟哥Linux私房菜基础学习篇 第二部分 Linux 文件、目录与磁盘格式_Linux文件权限与 目录配置_Linux文件与目录管理...
- squid 的配置详解 (转)--SeriesI 收藏
- YonStore应用+摩天知识,用友树立云生态新标杆
- lseek函数实现对打开文件的定位
- 文件授权以及查看系统的一些信息命令
- python项目打包部署到ios_Python iOS 自动打包脚本(包含上传到fir)
- Java学习总结(随笔)——利用JSON解析实现网络下载
- FPGA学习记录_设计一个计数器
- duet二重奏hp_Duet游戏安卓下载|Duet二重奏最新版下载v2.0.4-乐游网安卓下载
- mescroll下拉刷新上拉加载
- 有定位的含有 input的弹框,在有些手机光标乱跳
- ubuntu安装github 3D渲染库dirt
- uci2019计算机录取,美国加州大学这九所分校2019最新录取数据
- WPE1.3C的详细使用教程
- 什么是云主机,云主机是什么样的?
- Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane),TextArea右键菜单 组件使用案例
- PLC控制例子——中央空调机房控制系统
- jsoup爬取驾考题库
- Taskade for Mac(mac任务清单管理器)