在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
链表结点与函数的定义如下:
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
}; void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);
思路:我们可以很方便的得到要删除的结点的下一结点,如果我们把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除。就相当于把当前需要删除的结点给删除了。
实现代码如下:
#include<iostream>
#include<stdlib.h>
using namespace std; //链表结构
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
}; //创建一个链表结点
ListNode* CreateListNode(int value)
{
ListNode *pNode = new ListNode();
pNode->m_nValue=value;
pNode->m_pNext=NULL;
return pNode; } //遍历链表中所有结点
void PrintList(ListNode* pHead)
{
ListNode *pNode = pHead;
while(pNode!=NULL)
{
cout<<pNode->m_nValue<<" ";
pNode=pNode->m_pNext;
}
cout<<endl;
}
//连接两个结点
void ConnectListNode(ListNode *pCurrent,ListNode* pNext)
{
if(pCurrent==NULL)
{
cout<<"前一个结点不能为空"<<endl;
exit();
}
else
{
pCurrent->m_pNext=pNext;
}
} //删除链表
void DestroyList(ListNode* pHead)
{
ListNode* pNode = pHead;
while(pNode != NULL)
{
pHead = pHead->m_pNext;
delete pNode;
pNode = pHead;
}
} //考虑四种不同的情况
void DeleteNode(ListNode** pListHead, ListNode* pTobeDeleted)
{
if(!pListHead || !pTobeDeleted)
return; //要删除的结点不是尾结点
if(pTobeDeleted->m_pNext != NULL)
{
ListNode* pNext = pTobeDeleted->m_pNext;
pTobeDeleted->m_nValue = pNext->m_nValue;
pTobeDeleted->m_pNext = pNext->m_pNext; delete pNext;
pNext = NULL;
}
//链表只有一个结点,删除头结点(也是尾结点)
else if(*pListHead == pTobeDeleted)
{
delete pTobeDeleted;
pTobeDeleted = NULL;
*pListHead = NULL;
}
//链表中有多个结点,删除尾结点 ,只能遍历链表
else
{
ListNode* pNode = *pListHead;
while(pNode->m_pNext != pTobeDeleted)
{
pNode = pNode->m_pNext;
} pNode->m_pNext = NULL;
delete pTobeDeleted;
pTobeDeleted = NULL;
}
} int main()
{
//创建结点
ListNode* pNode1 = CreateListNode();
ListNode* pNode2 = CreateListNode();
ListNode* pNode3 = CreateListNode();
ListNode* pNode4 = CreateListNode();
ListNode* pNode5 = CreateListNode();
ListNode* pNode6 = CreateListNode();
ListNode* pNode7 = CreateListNode();
//连接结点
ConnectListNode(pNode1,pNode2);
ConnectListNode(pNode2,pNode3);
ConnectListNode(pNode3,pNode4);
ConnectListNode(pNode4,pNode5);
ConnectListNode(pNode5,pNode6);
ConnectListNode(pNode6,pNode7); PrintList(pNode1);
//删除结点
DeleteNode(&pNode1,pNode4);
//打印链表
PrintList(pNode1);
//删除链表
DestroyList(pNode1); return ;
}
运行结果如下:

在O(1)时间删除链表结点的更多相关文章
- 剑指Offer面试题:12.在O(1)时间删除链表结点
一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class ...
- 【面试题013】在O(1)时间删除链表结点
[面试题013]在O(1)时间删除链表结点 我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表 ...
- 【Java】 剑指offer(17) 在O(1)时间删除链表结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除 ...
- 《剑指offer》第十八题(在O(1)时间删除链表结点)
// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...
- 面试题18(一):在O(1)时间删除链表结点
// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点.链表结点与函数的定义如下: // struct Lis ...
- 第18题:在O(1)时间删除链表结点+删除链表中重复的节点
题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删 ...
- 33.在O(1)时间删除链表结点[DeleteListNode]
[题目] 给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: C++ Code 123456 struct ListNode { int m_ ...
- 剑指Offer:面试题13——在O(1)时间删除链表结点
问题描述: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点.链表结点与函数的定义如下: public class ListNode{ int value; ListNode ...
- P99、面试题13:在o(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在o(1)时间删除该结点.链表结点与函数的定义如下:struct ListNode{ int m_nValue; List ...
随机推荐
- .net简单录音和播放音频文件代码
本代码特点:不用DirectX ,对于C/S .B/S都适用. 方法: //mciSendStrin.是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等,下面介绍一下它的 ...
- C++ AppendMenu
主题 1. 系统菜单下面添加自定义菜单 2. 3. 4. 5. AppendMenu The AppendMenu function appends a new item to th ...
- C++赋值运算符函数
为类添加赋值运算符函数: 类型定义 class CMyString { public: CMyString(char *pData = NULL); CMyString(const CMyString ...
- UVA 10006 - Carmichael Numbers 数论(快速幂取模 + 筛法求素数)
Carmichael Numbers An important topic nowadays in computer science is cryptography. Some people e ...
- 如何制作按钮hover状态
1.选中文字加背景图层 2.Ctrl+J复制图层,向下轻移. 3.点击所复制图层的背景图层,右键选中——混合选项 弹出图层样式框: 4.选择渐变叠加,将渐变——反向勾选上,确定: 5.完成,效果如图.
- String StringBuilder以及StringBuffer
例一:[看了威哥视频,下面更好理解] package sunjava; public class String_test { public static void main(String[] args ...
- 导入GPUImage,实时滤镜相机,GUPImage遇到的问题解决,_OBJC_METACLASS_$_GBGPUImageView in GBGPUImageView.o
导入方法转自:http://www.cnblogs.com/S2-huai/p/3881349.html.. (原文:http://www.cnblogs.com/YouXianMing/p/3709 ...
- 琐碎-关于StringTokenizer工具
属于:java.util包 构造函数: 1. StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象.java默认的分隔符是“空格”.“制表 ...
- B - Plane of Tanks: Pro
Description Vasya has been playing Plane of Tanks with his friends the whole year. Now it is time to ...
- Subsequence
Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...