题目一:在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题 删除链表中的节点的更多相关文章

  1. 剑指offer(56)删除链表中重复的节点

    一直忘记更新了,把剑指offer更新完吧.... 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3-&g ...

  2. 【剑指Offer】56、删除链表中重复的结点

      题目描述:   在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4-> ...

  3. 【校招面试 之 剑指offer】第16题 数值的整数次方

    方法1:直接求解,但是要注意特殊情况的处理:即当指数为负,且底数为0的情况. #include<iostream> using namespace std; template<typ ...

  4. 【校招面试 之 剑指offer】第11题 旋转数组中的最小数字

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如: 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...

  5. 【校招面试 之 剑指offer】第10-3题 矩阵覆盖问题

    题目:我们可以使用2✖️1的小矩形横着或者竖着去覆盖更大的矩形.请问用8个2✖️1的小矩形无重叠地覆盖一个2✖️8的大矩形,共有多少种方法? 分析:当放第一块时(假定从左边开始)可以横着放,也可以竖着 ...

  6. 【校招面试 之 剑指offer】第10-2题 青蛙跳台阶问题

    题目1:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个n级台阶共有多少种跳法? 题目2:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶...也可以一次跳n级台阶.求该青蛙跳上一个 ...

  7. 【校招面试 之 剑指offer】第10-1题 斐波那契数列

    递归以及非递归实现: #include<iostream> using namespace std; long long fun(long long n){ if(n == 0){ ret ...

  8. 【校招面试 之 剑指offer】第9-2题 用两个队列实现一个栈

    #include<iostream> #include<queue> using namespace std; // 对于出栈解决的思路是:将queue1的元素除了最后一个外全 ...

  9. 【校招面试 之 剑指offer】第9-1题 用两个栈实现一个队列

    #include<iostream> #include<stack> using namespace std; template <typename T> void ...

随机推荐

  1. Linux-mail设置

    邮箱文件设置 #配置发邮件 /etc/mail.rc中追加 set bsdcompat set from=c4kaichen@163.com .com set smtp-auth-user=c4kai ...

  2. Java中的volatile关键字为什么不是不具有原子性

    Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值是原子操作,为什么?为什么volatile能替代简单的锁,却不能保证原子性?这里面涉及volat ...

  3. hint之qb_name

    http://www.thinkindata.com/?p=34 该hint用于子查询(query_block)   很多的情况下,如果子查询共用相同的别名(alias), 可以通过设定不同的qb_n ...

  4. Django中间件执行流程

    中间件函数是 django 框架为我们预留的函数接口, 让我们可以干预请求和应答的过程 1. 获取浏览器端的IP地址: 使用 request.META[‘REMOTE_ADDR’] 2. 使用中间件 ...

  5. 小朋友学C语言(7)

    数组 一.数组简介 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比 ...

  6. CentOS重新加载网卡报错 Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/

    重新加载网卡时出现的错误如下: 1 [root@vdb1 dev]# service network restart 2 Shutting down interface eth0: Device st ...

  7. windows 和 Linux 安装rabbitmq

    windows 安装 rabbitmq 1,安装erlang 点击进入官网下载:http://erlang.org/download/ 2.安装rabbitmq 点击进入官网下载:http://www ...

  8. jmeter测试20个QPS下的响应时间-设置QPS限制

    添加--->定时器--->Constant Throughput Timer Constant Throughput Timer 的主要属性介绍: 名称:定时器的名称 Target thr ...

  9. Mysql-事务,原子性操作

    事物分为 自动(默认的)和手动(需开启事务)两种 -- 事务 start transaction; -- commite; 提交事务 -- rollback; 回滚事务 create table if ...

  10. 3.1_分类算法之k-近邻

    分类算法之k-近邻 k-近邻算法采用测量不同特征值之间的距离来进行分类 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 使用数据范围:数值型和标称型 一个例子弄懂k-近 ...