【校招面试 之 剑指offer】第18题 删除链表中的节点
题目一:在O(1)时间内删除链表节点。
给定单项链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。
思路:(1)如果要删除的节点不是链表的尾节点,则将被删除节点的内容复制到该节点,然后删除被复制的节点。
(2)如果删除的节点为链表节点的尾节点,则我们需要从头结点开始遍历到尾节点的前驱节点,删除尾节点。
(3)如果链表只有一个节点(除了头结点),则按着(2)删除的同时,还需要head->next = NULL;
#include<iostream>
using namespace std; template<typename T>
struct listNode{
T data;
listNode *next;
}; template<typename T>
listNode<T> *create(listNode<T> *list){
listNode<T> *head = list; // 头结点
T tempData;
cout<<"输入元素(int),以空格分开,输入-1结束:"<<endl;
while(1){
cin>>tempData;
if(tempData == -1){
return head;
}else{
listNode<T> *p = new listNode<T>();
p->data = tempData;
p->next = head->next;
head->next = p;
}
}
return head;
} template<typename T>
void outputList(listNode<T> *list){
listNode<T> *tempList = list->next;
while(tempList){
cout<<tempList->data<<" ";
tempList = tempList->next;
}
cout<<endl;
} template<typename T>
listNode<T> *searchListNode(listNode<T> *list, T t){
listNode<T> *tempList = list->next;
while(tempList){
if(tempList->data == t){
return tempList;
}else{
tempList = tempList->next;
}
}
cout<<"查找节点不存在!"<<endl;
} template<typename T>
void deleteListNode(listNode<T> *list, listNode<T> *deleteListNode){
listNode<T> *tempListNode = list;
// 首先判断是否是尾节点
if(deleteListNode->next == NULL){
if(tempListNode->next == deleteListNode){
delete deleteListNode;
tempListNode->next = NULL;
return;
}else{
// 常规的删除尾节点的方式(从头遍历到尾节点的前驱节点)
while(tempListNode->next != deleteListNode){
tempListNode = tempListNode->next;
}
delete deleteListNode;
tempListNode->next = NULL;
return;
}
}
// 使用纯的O(1)时间删除节点
listNode<T> *tempListNode1 = deleteListNode->next;
deleteListNode->data = tempListNode1->data;
deleteListNode->next = tempListNode1->next;
delete tempListNode1;
}
/*
测试用例1:1 2 3 4 5 6 7 -1
测试用例2:1 2 4 5 6 7 3 -1
测试用例3:3 1 2 4 5 6 7 -1
测试用例4:3 -1
*/
int main(){
listNode<int> *list = new listNode<int>();
listNode<int> *searchReturnlistNode = NULL;
// create list
create(list);
// output list
outputList(list);
// search and return which listNode value is 3
searchReturnlistNode = searchListNode(list, 3);
// cout<<"验证一下(whether equals 3):"<<searchReturnlistNode->data<<endl;
// delete listNode
deleteListNode(list, searchReturnlistNode);
// check in list when delete listNode
outputList(list);
system("pause");
return 0;
}
题目2:删除链表中重复的节点。
在一个排序的链表中,如何删除重复的节点?
思路:常规思路
#include<iostream>
using namespace std; template<typename T>
struct listNode{
T data;
listNode *next;
}; template<typename T>
listNode<T> *create(listNode<T> *list){
listNode<T> *head = list; // 头结点
T tempData;
cout<<"输入元素(int),以空格分开,输入-1结束:"<<endl;
while(1){
cin>>tempData;
if(tempData == -1){
return head;
}else{
listNode<T> *p = new listNode<T>();
p->data = tempData;
p->next = head->next;
head->next = p;
}
}
return head;
} template<typename T>
void outputList(listNode<T> *list){
listNode<T> *tempList = list->next;
while(tempList){
cout<<tempList->data<<" ";
tempList = tempList->next;
}
cout<<endl;
} //
template<typename T>
void deleteRepeatListNodeValue(listNode<T> *list){
listNode<T> *tempListNode = list->next;
while(tempListNode->next){
if(tempListNode->data == tempListNode->next->data){
listNode<T> *tempListNode1 = tempListNode->next;
tempListNode->next = tempListNode1->next;
delete tempListNode1;
}else{
tempListNode = tempListNode->next;
}
}
} int main(){
listNode<int> *list = new listNode<int>();
listNode<int> *searchReturnlistNode = NULL;
// create list
create(list);
// output list
outputList(list); //delete repeat values
deleteRepeatListNodeValue(list);
// check in list when delete repeat values in listNode
outputList(list);
system("pause");
return 0;
}
【校招面试 之 剑指offer】第18题 删除链表中的节点的更多相关文章
- 剑指offer(56)删除链表中重复的节点
一直忘记更新了,把剑指offer更新完吧.... 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3-&g ...
- 【剑指Offer】56、删除链表中重复的结点
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4-> ...
- 【校招面试 之 剑指offer】第16题 数值的整数次方
方法1:直接求解,但是要注意特殊情况的处理:即当指数为负,且底数为0的情况. #include<iostream> using namespace std; template<typ ...
- 【校招面试 之 剑指offer】第11题 旋转数组中的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如: 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...
- 【校招面试 之 剑指offer】第10-3题 矩阵覆盖问题
题目:我们可以使用2✖️1的小矩形横着或者竖着去覆盖更大的矩形.请问用8个2✖️1的小矩形无重叠地覆盖一个2✖️8的大矩形,共有多少种方法? 分析:当放第一块时(假定从左边开始)可以横着放,也可以竖着 ...
- 【校招面试 之 剑指offer】第10-2题 青蛙跳台阶问题
题目1:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个n级台阶共有多少种跳法? 题目2:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶...也可以一次跳n级台阶.求该青蛙跳上一个 ...
- 【校招面试 之 剑指offer】第10-1题 斐波那契数列
递归以及非递归实现: #include<iostream> using namespace std; long long fun(long long n){ if(n == 0){ ret ...
- 【校招面试 之 剑指offer】第9-2题 用两个队列实现一个栈
#include<iostream> #include<queue> using namespace std; // 对于出栈解决的思路是:将queue1的元素除了最后一个外全 ...
- 【校招面试 之 剑指offer】第9-1题 用两个栈实现一个队列
#include<iostream> #include<stack> using namespace std; template <typename T> void ...
随机推荐
- shell 2变量
shell变量 定义变量 变量名命名规则: 1.命名只能使用英文字母.数字和下划线,首个字符不能以数字开头 2.中间不能有空格,可以使用下划线 3.不能使用标点符号 4.不能使用sh中的关键字,可用h ...
- 关于clearfix和clear的讨论
本文摘自百度文库 还是提到了一个关于网页制作很古老的问题,浮动的清除. 虽然看过一些资料介绍说能不用浮动就尽量不要用,但对定位不是很熟的我来说,浮动就不能不用了:既然惹上这个麻烦,就得想个办法进行解决 ...
- 邮件服务器fixpost服务(1)
发邮件所用的协议,SMTP协议,端口TCP25 收邮件所用的协议,pop3.imap协议 邮件客户端(MUA):foxmail.闪电邮.邮件大师.outlook 搭建邮件服务器所用到的软件(MTA邮件 ...
- 关于win时间同步的解决方案
将以下的批处理执行:net stop w32time sc config w32time start= auto net start w32time w32tm /config /update /ma ...
- 自己写的一个jQuery对联广告插件
效果图: 文件的位置摆放: 插件的代码: ;(function($){ $.extend({ dLAdv:function(options){ var defaults={ leftType:0,// ...
- 由一条普通的link引用引发的无数问号,大家能回答的帮忙回答回答吧.
<link type="text/css" rel="stylesheet" href="1.css" /> 对于前台工作者来说 ...
- 报表系统OLAP
实现报表系统可自定义定制: 1.纬度,事实表,用户自定义观察纬度,实现报表自定义(自定义纬度树结构---通过这个树结构,后台自动生成报表SQL,用户仅仅配置纬度关系即可)----报表配置纬度关 系 2 ...
- php 编程笔记分享
php获取POST数据的三种方法php 图片加水印源代码php+ajax+json的一个最简单实例php 汉字转拼音源码php遍历目录,生成目录下每个文件的md5值并写入到结果文件中php实现linu ...
- Java内存原型分析:基本知识
转载: Java内存原型分析:基本知识 java虚拟机内存原型 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静 ...
- CUDA C Programming Guide 在线教程学习笔记 Part 5
附录 A,CUDA计算设备 附录 B,C语言扩展 ▶ 函数的标识符 ● __device__,__global__ 和 __host__ ● 宏 __CUDA_ARCH__ 可用于区分代码的运行位置. ...