题目:用 C++设计一个不能被继承的类。
分析:这是 Adobe 公司 2007 年校园招聘的最新笔试题。
这道题除了考察应聘者的 C++基本功底外,还能考察反应能力,是一道很好的题目。
(2).在 O(1)时间内删除链表结点。
题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点。链表结点的定义如下:
struct ListNode
{
int
m_nKey;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
分析:这是一道广为流传的 Google 面试题,能有效考察我们的编程基本功,
还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解。
---------------------------------------
哈哈 这两道题合在一起吧。。
先考虑第二题,我们先设计一个类List来作为链表类。
这里需要删除这个节点,能够实现时间复杂度O(1),一般先想到hash办法,可是链表有个前扑后继的特点,删除了这个节点,那我们还必须把上一个节点和下一个节点链接上,可是我们没有上一个节点的指针啊。
我们可以直接利用下一个节点,把下一个节点的值拿过来,然后让p->next = p->next->next;
这样就实现来逻辑上的删除,最后记得delete
第一题其实就是设计模式里面的单例模式,我们只需要把构造函数变成私有就好了,本来想把析构函数也变成私有,但是发现不能编译通过,后来想想,也是,不然以后清理工作又得手动了,还不如就让他共有 就好来。见Queue这个类
//============================================================================
// Name : DeleteNode.cpp
// Author : YLF
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
class List{
private:
ListNode* head;
int hashTable[100];
private:
List(){}
public:
static List getInstance(){
List list;
list.head = NULL;
return list;
}
void add(int value){
ListNode* temp = new ListNode();
temp->m_nKey = value;
temp->m_pNext = NULL;
if(head == NULL){
head = temp;
return;
}
ListNode* p = head;
while(p->m_pNext != NULL)
p = p->m_pNext;
p->m_pNext = temp;
}
void Print(){
ListNode* p = head;
while(p!=NULL){
cout<<p->m_nKey<<" ";
p = p->m_pNext;
}
cout<<endl;
}
void Delete(ListNode* pToBeDeleted){
pToBeDeleted->m_nKey = pToBeDeleted->m_pNext->m_nKey;
pToBeDeleted->m_pNext = pToBeDeleted->m_pNext->m_pNext;
delete pToBeDeleted->m_pNext;
}
ListNode* operator[](int index){
ListNode* p = head;
while(index-- >0)
p = p->m_pNext;
return p;
}
~List(){
ListNode* p = head;
while(head != NULL){
p = head->m_pNext;
delete head;
head = p;
}
cout<<"clear OK";
}
};
/*
* 下面这个类是错误的,它不能继承自List
*/
class Queue : List{
};
int main() {
List list = List::getInstance();
int i = 0;
cin>>i;
int value;
ListNode* deleted = NULL;
while(i-- >0){
cin>>value;
list.add(value);
}
list.Print();
deleted = list[2];
list.Delete(deleted);
list.Print();
return 0;
}
4
2 7 5 3
2 7 5 3
2 7 3
clear OK