删除无头单链表的非尾结点并打印单链表
2017-07-17 22:25
295 查看
问题描述:假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
一般链表的删除需要顺着头结点向下找到当前待删节点的前驱节点,然后让前驱节点指向后驱节点就行了。这里,没有头结点,就没办法找到前驱结点。但我们可以采用“狸猫换太子”的做法。我们把当前结点“看成”是前驱结点,把后续节点当做待删结点删除(删除之前,记下后续结点的值),只需要让当前结点指向后驱结点的后驱结点。最后把后续结点值赋给当前结点的值。
一般链表的删除需要顺着头结点向下找到当前待删节点的前驱节点,然后让前驱节点指向后驱节点就行了。这里,没有头结点,就没办法找到前驱结点。但我们可以采用“狸猫换太子”的做法。我们把当前结点“看成”是前驱结点,把后续节点当做待删结点删除(删除之前,记下后续结点的值),只需要让当前结点指向后驱结点的后驱结点。最后把后续结点值赋给当前结点的值。
//删除一个无头单链表的非尾节点 #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; }
相关文章推荐
- 1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表
- 删除一个无头单链表的非尾节点+从尾到头打印单链表
- 每日一题——删除无头链表的非尾节点、逆向打印单链表
- 单链表---删除无头单链表的非尾结点(不遍历链表)
- 每日一刷——删除无头链表非尾结点&倒序打印链表
- 1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表
- 删除不带头结点的单链表的非尾结点&&逆序打印单链表
- day05删除一个无头单链表的非尾节点 +从尾到头打印单链表+复杂链表的复制
- 判断链表相交,删除无头单链表的非尾节点及倒序打印单链表——题集(四)
- 17_7_17:删除一个无头单链表的非尾节点。从尾到头打印单链表
- 单链表中头结点的有无. 并讨论下有无头结点在单链表的创建,打印,插入,逆置,删除中的区别.
- 【链表】删除一个无头单链表的非尾节点 以及从尾到头打印单链表
- <笔试><面试>单链表相关(1)从尾到头打印链表、删除一个无头链表的非尾结点
- 笔试/面试:删除一个无头单链表的非尾节点 ,从尾到头打印单链表
- <笔试><面试>单链表相关(1)从尾到头打印链表、删除一个无头链表的非尾结点
- 链表面试题(一)---删除一个无头单链表的非尾结点
- C语言:【单链表】删除一个无头单链表的非尾节点
- 链表之无头指针删除单链表指定结点
- 删除一个无头单链表的非尾节点(C语言)
- 链表面试题逆序打印,删除无头非尾节点,非头位置插入,约瑟夫环,查找中间和倒数第k个节点