题目一:在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. shell 2变量

    shell变量 定义变量 变量名命名规则: 1.命名只能使用英文字母.数字和下划线,首个字符不能以数字开头 2.中间不能有空格,可以使用下划线 3.不能使用标点符号 4.不能使用sh中的关键字,可用h ...

  2. 关于clearfix和clear的讨论

    本文摘自百度文库 还是提到了一个关于网页制作很古老的问题,浮动的清除. 虽然看过一些资料介绍说能不用浮动就尽量不要用,但对定位不是很熟的我来说,浮动就不能不用了:既然惹上这个麻烦,就得想个办法进行解决 ...

  3. 邮件服务器fixpost服务(1)

    发邮件所用的协议,SMTP协议,端口TCP25 收邮件所用的协议,pop3.imap协议 邮件客户端(MUA):foxmail.闪电邮.邮件大师.outlook 搭建邮件服务器所用到的软件(MTA邮件 ...

  4. 关于win时间同步的解决方案

    将以下的批处理执行:net stop w32time sc config w32time start= auto net start w32time w32tm /config /update /ma ...

  5. 自己写的一个jQuery对联广告插件

    效果图: 文件的位置摆放: 插件的代码: ;(function($){ $.extend({ dLAdv:function(options){ var defaults={ leftType:0,// ...

  6. 由一条普通的link引用引发的无数问号,大家能回答的帮忙回答回答吧.

    <link type="text/css" rel="stylesheet" href="1.css" /> 对于前台工作者来说 ...

  7. 报表系统OLAP

    实现报表系统可自定义定制: 1.纬度,事实表,用户自定义观察纬度,实现报表自定义(自定义纬度树结构---通过这个树结构,后台自动生成报表SQL,用户仅仅配置纬度关系即可)----报表配置纬度关 系 2 ...

  8. php 编程笔记分享

    php获取POST数据的三种方法php 图片加水印源代码php+ajax+json的一个最简单实例php 汉字转拼音源码php遍历目录,生成目录下每个文件的md5值并写入到结果文件中php实现linu ...

  9. Java内存原型分析:基本知识

    转载: Java内存原型分析:基本知识 java虚拟机内存原型 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静 ...

  10. CUDA C Programming Guide 在线教程学习笔记 Part 5

    附录 A,CUDA计算设备 附录 B,C语言扩展 ▶ 函数的标识符 ● __device__,__global__ 和 __host__ ● 宏 __CUDA_ARCH__ 可用于区分代码的运行位置. ...