算法习题59,60:不能被继承的类,O(1)时间复杂度删除链表节点

本文详细介绍了如何使用C++设计一个不能被继承的类,以及如何在O(1)时间内删除链表中的指定结点。通过实例演示了链表类的设计和节点删除的实现方法,旨在提高编程效率和理解复杂数据结构的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1).不能被继承的类。
题目:用 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值