删除无头单链表的非尾结点并打印单链表
来源:互联网 发布:ckplayer电影网站源码 编辑:程序博客网 时间:2024/06/10 01:33
问题描述:假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
一般链表的删除需要顺着头结点向下找到当前待删节点的前驱节点,然后让前驱节点指向后驱节点就行了。这里,没有头结点,就没办法找到前驱结点。但我们可以采用“狸猫换太子”的做法。我们把当前结点“看成”是前驱结点,把后续节点当做待删结点删除(删除之前,记下后续结点的值),只需要让当前结点指向后驱结点的后驱结点。最后把后续结点值赋给当前结点的值。
//删除一个无头单链表的非尾节点 #include<iostream> #include<stdlib.h> using namespace std; typedef int DataType; typedef struct SListNode { DataType data; //数据 struct SListNode* next; //指向下一个结点的指针 }SListNode; SListNode* CreateNode(DataType x) //创造结点 { //1.先开辟空间 2.数据赋给data 3.指针置空 SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode)); NewNode->data = x; NewNode->next = NULL; return NewNode; } void PushBack(SListNode* &ppHead, int Data) { //1.none 2.one and more if (ppHead == NULL) { ppHead = CreateNode(Data); } else { //1.先找到尾结点 2.把新节点链起来 SListNode* cur = ppHead; while (cur->next) { cur = cur->next; } cur->next = CreateNode(Data); } } //删除一个无头单链表的非尾节点 void DelNoHeadNotTail(SListNode* &ppHead , int pos) { if (ppHead == NULL) //边界条件检查 return; else { SListNode* prev = ppHead; //prev指向要删除结点的前一个结点 SListNode* cur = prev->next; //cur指向要删除节点 while (cur->data!= pos) { cur = cur->next; prev = prev->next; } prev->next = cur->next; free(cur); cur->next = NULL; } } void PrintSNodeList(SListNode*&ppHead) { while (ppHead) { printf("%d->", ppHead->data); ppHead = ppHead->next; } cout << "NULL"; printf("\n"); } void Test() { SListNode* pHead = NULL; PushBack(pHead, 1); PushBack(pHead, 2); PushBack(pHead, 3); PushBack(pHead, 4); PushBack(pHead, 5); DelNoHeadNotTail(pHead, 2); PrintSNodeList(pHead); } int main() { Test(); system("pause"); return 0; }
阅读全文
0 0
- 删除无头单链表的非尾结点并打印单链表
- 删除不带头结点的单链表的非尾结点&&逆序打印单链表
- <笔试><面试>单链表相关(1)从尾到头打印链表、删除一个无头链表的非尾结点
- 删除或插入无头单链表的非尾结点
- 单链表中头结点的有无. 并讨论下有无头结点在单链表的创建,打印,插入,逆置,删除中的区别.
- 单链表---删除无头单链表的非尾结点(不遍历链表)
- 链表面试题(一)---删除一个无头单链表的非尾结点
- 【链表】删除一个无头单链表的非尾节点 以及从尾到头打印单链表
- 删除一个无头单链表的非尾节点+从尾到头打印单链表
- 17_7_17:删除一个无头单链表的非尾节点。从尾到头打印单链表
- 笔试/面试:删除一个无头单链表的非尾节点 ,从尾到头打印单链表
- 1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表
- 1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表
- 单链表操作之删除链表的一个非尾结点
- C语言实现非循环双链表节点的删除(带头结点尾结点)
- 单链表的结点删除
- day05删除一个无头单链表的非尾节点 +从尾到头打印单链表+复杂链表的复制
- pointer指向链表的某结点(非尾结点), 且不知道该结点的前驱结点(也不知道更前驱的结点), 请给出删除该结点的方法
- 2017.7.17 ajaxcss样式事件的获取和使用,及jsp初级语法
- I/O多路复用之select
- 组合
- CodeForces 825E Educational #25 E:拓扑排序+优先队列
- Caffe:CPU模式下使用openblas-openmp(多线程版本)
- 删除无头单链表的非尾结点并打印单链表
- RxJava2+Retrofit2+RxLifecycle2使用MVP模式构建项目
- 一个含有crc32算法的CrackMe分析
- 坚持,努力,终将会成功!
- 引用计数的写时拷贝
- 从头认识Java之(Thinking in Java随记系列)Ⅱ
- 使用Canvas对应用图标的角标做缩放动画,具有呼吸效果
- Aruco
- 每天记录一点点--漏洞修复02(后续补充,以漏洞修复XX为版本)