单向链表(二) 删除指定位置的节点
2014-07-31 15:35
393 查看
1、删除单向链表中的某个节点,比如删除第3个节点,如下图所示:
2、为了便于说明,将节点的位置 作为 节点的数据值。由图可知,要删除第3个节点,只要先使第2个节点指向第4个节点,构成一个新的链表1 -> 2 -> 4;接着释放第3个节点就可以了。
3、具体实现函数代码:
或
4、几个注意点:
一、判断待删除的节点是否为头结点;
二、注意传入的位置值(location)是否有效;
三、注意链表节点只有一个时的情况。
5、main函数中调用:
6、运行结果:
2、为了便于说明,将节点的位置 作为 节点的数据值。由图可知,要删除第3个节点,只要先使第2个节点指向第4个节点,构成一个新的链表1 -> 2 -> 4;接着释放第3个节点就可以了。
3、具体实现函数代码:
tagNode* DeleteNode(tagNode *pHead, int location) { tagNode *pNewHead = NULL; // 新的头结点 tagNode *pTemp = pHead; // 临时节点 tagNode *pDel = NULL; // 待删除节点 int nCount = 1; if (pHead == NULL) { printf("链表为空!\n"); return pHead; } // 如果要删除的是头结点(location == 1) if (location == 1) { pNewHead = pTemp->pNext; free(pTemp); if (pNewHead == NULL) { return NULL; } else { return pNewHead; } } nCount++; // 删除非头结点 while (pTemp) { if(location == nCount) { pDel = pTemp->pNext; pTemp->pNext = pTemp->pNext->pNext; free(pDel); return pHead; } else { pTemp = pTemp->pNext; nCount++; } } printf("位置%d处无节点!\n", location); return pHead; }
或
void DeleteNode(tagNode **pHead, int location) { tagNode *pNewHead = NULL; // 新的头结点 tagNode *pTemp = *pHead; // 临时节点 tagNode *pDel = NULL; // 待删除节点 int nCount = 1; if (pHead == NULL) { printf("链表为空!\n"); return; } // 如果要删除的是头结点(location == 1) if (location == 1) { pNewHead = pTemp->pNext; free(pTemp); if (pNewHead == NULL) { *pHead = NULL; } else { *pHead = pNewHead; } return; } nCount++; // 删除非头结点 while (pTemp) { if(location == nCount) { pDel = pTemp->pNext; pTemp->pNext = pTemp->pNext->pNext; free(pDel); return; } else { pTemp = pTemp->pNext; nCount++; } } printf("位置%d处无节点!\n", location); }
4、几个注意点:
一、判断待删除的节点是否为头结点;
二、注意传入的位置值(location)是否有效;
三、注意链表节点只有一个时的情况。
5、main函数中调用:
int _tmain(int argc, _TCHAR* argv[]) { tagNode *p = NULL; p = CreateLinkedList(); int location; printf("\n\n遍历:\n"); TraverseNodes(p); printf("\n\n请输入待删除的节点位置:"); scanf("%d", &location); getchar(); //p = DeleteNode(p, location); DeleteNode(&p, location); printf("\n\n遍历:\n"); TraverseNodes(p); FreeLinkedList(p); getchar(); return 0; }
6、运行结果:
相关文章推荐
- 从单向链表中删除指定值的节点(OJ 不用看这题)
- 【华为OJ】【093-从单向链表中删除指定值的节点】
- 数据结构之链表面试题汇总(四)得到两个单链表相交的第一个交点、用O(1)的时间效率删除单向链表中的指定节点
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 华为OJ——从单向链表中删除指定值的节点
- [编程题]从单向链表中删除指定值的节点
- 单向链表(三) 在指定位置插入新的节点
- OJ-------从单向链表中删除指定节点
- 链表删除指定位置节点
- 删除单向链表的指定节点
- 从单向链表中删除指定值的节点(格式控制真坑,末尾要打印空格,样例输出有错误)
- 华为OJ——从单向链表中删除指定值的节点
- 从单向链表中删除指定值的节点
- 华为OJ:从单向链表中删除指定值的节点
- 华为OJ从单向链表中删除指定值的节点
- 华为机试:从单向链表中删除指定值的节点
- 华为oj中级 从单向链表删除指定节点
- 24.从单向链表中删除指定值的节点
- 从单向链表中删除指定值的节点
- 从单向链表中删除指定值的节点