对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针。在下面本人实现了 单链表的 增   删   插  查  改。

#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个节点等问题相关推荐

  1. 22 链表中倒数第k个节点

    22 链表中倒数第k个节点 为了实现只遍历一次就能找到倒数第kkk个节点,我们可以定义两个指针.第一个指针从链表的头指针开始遍历向前走k−1k-1k−1步,第二个指针保持不动:从第kkk步开始,第二个 ...

  2. python 链表倒数第k个节点_链表-删除单链表中倒数第k个节点

    题目 实现一个函数,一个可以删除单链表中倒数第k个节点 难度 简单 分析 本题比较简单,实现方法多种多样,这里提供一种方法 首先明确一点,在单链表中删除倒数第k个节点,需要找到他的前一个节点,让前一个 ...

  3. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

  4. 单链表倒数第K个节点的查找和显示

    单链表倒数第K个节点的查找和显示 最近在学回顾之前学到的知识,正好碰到了关于链表查找的一道面试题,在此贴出来,与小伙伴们共同交流~ 在刚看到题目,其实很容易就想到一个方法,就是先求链表的长度(leng ...

  5. python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法

    本文实例为大家分享了python实现单链表中删除倒数第K个节点的具体代码,供大家参考,具体内容如下 题目: 给定一个链表,删除其中倒数第k个节点. 代码: class LinkedListAlgori ...

  6. 链表之删除单链表倒数第K个节点

    删除单链表倒数第K个节点 题目: 删除单链表中倒数第K个节点, 思路:             给我们一个单链表,我们需要删除倒数第K个节点,比如链表每个节点值是1.2.3.4.5.6     K值是 ...

  7. c语言单链表删除倒数第k个数,在单链表中删除倒数第k个节点

    实现方式很多,在这里只说两种实现方式.看不懂时候,大家可以画画图,对理解为什么很有帮助. 第一种方式: 1.首先判断K值和链表是否为空,如果k<=0,或链表为空,直接返回head: 2.满足上面 ...

  8. 【小f的刷题笔记】(JS)链表 - 单链表的倒数第 k 个节点 LeetCode19 单链表的中点 LeetCode876

    [链表] 一.单链表的倒数第 k 个节点: ✔ 要求:只遍历一遍,链表有多长未知 LeetCode19 链接: 19.删除链表的倒数第N个结点 题目: 思路: 因为没有给头结点,我们就先定义一个哑结点 ...

  9. 链表问题2——在单链表中删除倒数第K个节点

    题目 实现一个函数,可以删除单链表中倒数第K个节点. 要求 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 思路 如果链表为空或者K值小于1,直接返回head即可,除此之外,从 ...

最新文章

  1. 水稻微生物组时间序列分析2a-相关分析
  2. 鸟哥Linux私房菜基础学习篇 第二部分 Linux 文件、目录与磁盘格式_Linux文件权限与 目录配置_Linux文件与目录管理...
  3. squid 的配置详解 (转)--SeriesI 收藏
  4. YonStore应用+摩天知识,用友树立云生态新标杆
  5. lseek函数实现对打开文件的定位
  6. 文件授权以及查看系统的一些信息命令
  7. python项目打包部署到ios_Python iOS 自动打包脚本(包含上传到fir)
  8. Java学习总结(随笔)——利用JSON解析实现网络下载
  9. FPGA学习记录_设计一个计数器
  10. duet二重奏hp_Duet游戏安卓下载|Duet二重奏最新版下载v2.0.4-乐游网安卓下载
  11. mescroll下拉刷新上拉加载
  12. 有定位的含有 input的弹框,在有些手机光标乱跳
  13. ubuntu安装github 3D渲染库dirt
  14. uci2019计算机录取,美国加州大学这九所分校2019最新录取数据
  15. WPE1.3C的详细使用教程
  16. 什么是云主机,云主机是什么样的?
  17. Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane),TextArea右键菜单 组件使用案例
  18. PLC控制例子——中央空调机房控制系统
  19. jsoup爬取驾考题库
  20. Taskade for Mac(mac任务清单管理器)

热门文章

  1. CSS魔法堂:重拾Border之——更广阔的遐想
  2. SQL SERVER 2008 登陆失败(SQL和windows都没有对应的权限)
  3. 万网稳居国内域名主机网站榜首 西部数码第二
  4. Shell关于Wget命令的使用技巧
  5. IE自动在后台运行,不知道是什么病毒?
  6. linux c 内存操作函数 简介
  7. socket PF_INET AF_INET 区别
  8. python3 url 提取 ip 端口 协议
  9. linux shell date 日期格式转换
  10. linux fuser 命令 查看文件/网络端口 被什么进程占用