【校招面试 之 剑指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 ...
随机推荐
- Linux-mail设置
邮箱文件设置 #配置发邮件 /etc/mail.rc中追加 set bsdcompat set from=c4kaichen@163.com .com set smtp-auth-user=c4kai ...
- Java中的volatile关键字为什么不是不具有原子性
Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值是原子操作,为什么?为什么volatile能替代简单的锁,却不能保证原子性?这里面涉及volat ...
- hint之qb_name
http://www.thinkindata.com/?p=34 该hint用于子查询(query_block) 很多的情况下,如果子查询共用相同的别名(alias), 可以通过设定不同的qb_n ...
- Django中间件执行流程
中间件函数是 django 框架为我们预留的函数接口, 让我们可以干预请求和应答的过程 1. 获取浏览器端的IP地址: 使用 request.META[‘REMOTE_ADDR’] 2. 使用中间件 ...
- 小朋友学C语言(7)
数组 一.数组简介 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比 ...
- CentOS重新加载网卡报错 Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/
重新加载网卡时出现的错误如下: 1 [root@vdb1 dev]# service network restart 2 Shutting down interface eth0: Device st ...
- windows 和 Linux 安装rabbitmq
windows 安装 rabbitmq 1,安装erlang 点击进入官网下载:http://erlang.org/download/ 2.安装rabbitmq 点击进入官网下载:http://www ...
- jmeter测试20个QPS下的响应时间-设置QPS限制
添加--->定时器--->Constant Throughput Timer Constant Throughput Timer 的主要属性介绍: 名称:定时器的名称 Target thr ...
- Mysql-事务,原子性操作
事物分为 自动(默认的)和手动(需开启事务)两种 -- 事务 start transaction; -- commite; 提交事务 -- rollback; 回滚事务 create table if ...
- 3.1_分类算法之k-近邻
分类算法之k-近邻 k-近邻算法采用测量不同特征值之间的距离来进行分类 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 使用数据范围:数值型和标称型 一个例子弄懂k-近 ...